लारवेल में कई डेटाबेस का उपयोग कैसे करें


225

मैं अपने सिस्टम में कई डेटाबेस को जोड़ना चाहता हूं। अधिकांश समय डेटाबेस MySQL है; लेकिन यह भविष्य में भिन्न हो सकता है अर्थात व्यवस्थापक ऐसी रिपोर्ट उत्पन्न कर सकता है जो विषम डेटाबेस प्रणाली के स्रोत का उपयोग करती है।

तो मेरा सवाल यह है कि क्या लारवेल ऐसी परिस्थितियों से निपटने के लिए कोई मोहरा प्रदान करता है? या किसी अन्य ढांचे में समस्या के लिए अधिक उपयुक्त क्षमताएं हैं?

जवाबों:


471

.env> = 5.0 (5.5 पर परीक्षण) का उपयोग करना

में .env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database1
DB_USERNAME=root
DB_PASSWORD=secret

DB_CONNECTION_SECOND=mysql
DB_HOST_SECOND=127.0.0.1
DB_PORT_SECOND=3306
DB_DATABASE_SECOND=database2
DB_USERNAME_SECOND=root
DB_PASSWORD_SECOND=secret

में config/database.php

'mysql' => [
    'driver'    => env('DB_CONNECTION'),
    'host'      => env('DB_HOST'),
    'port'      => env('DB_PORT'),
    'database'  => env('DB_DATABASE'),
    'username'  => env('DB_USERNAME'),
    'password'  => env('DB_PASSWORD'),
],

'mysql2' => [
    'driver'    => env('DB_CONNECTION_SECOND'),
    'host'      => env('DB_HOST_SECOND'),
    'port'      => env('DB_PORT_SECOND'),
    'database'  => env('DB_DATABASE_SECOND'),
    'username'  => env('DB_USERNAME_SECOND'),
    'password'  => env('DB_PASSWORD_SECOND'),
],

नोट: में mysql2अगर DB_username और DB_password एक ही है, तो आप उपयोग कर सकते हैं env('DB_USERNAME'), जिसमें metioned है .envपहली कुछ पंक्तियों।

बिना .env<5.0

कनेक्शन परिभाषित करें

app/config/database.php

return array(

    'default' => 'mysql',

    'connections' => array(

        # Primary/Default database connection
        'mysql' => array(
            'driver'    => 'mysql',
            'host'      => '127.0.0.1',
            'database'  => 'database1',
            'username'  => 'root',
            'password'  => 'secret'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),

        # Secondary database connection
        'mysql2' => array(
            'driver'    => 'mysql',
            'host'      => '127.0.0.1',
            'database'  => 'database2',
            'username'  => 'root',
            'password'  => 'secret'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
    ),
);

योजना

निर्दिष्ट करने के लिए कि किस कनेक्शन का उपयोग करना है, बस connection()विधि चलाएं

Schema::connection('mysql2')->create('some_table', function($table)
{
    $table->increments('id'):
});

क्वेरी बिल्डर

$users = DB::connection('mysql2')->select(...);

सुवक्ता

$connectionअपने मॉडल में चर सेट करें

class SomeModel extends Eloquent {

    protected $connection = 'mysql2';

}

आप setConnectionविधि या onस्थिर विधि के माध्यम से रनटाइम पर कनेक्शन को परिभाषित कर सकते हैं :

class SomeController extends BaseController {

    public function someMethod()
    {
        $someModel = new SomeModel;

        $someModel->setConnection('mysql2'); // non-static method

        $something = $someModel->find(1);

        $something = SomeModel::on('mysql2')->find(1); // static method

        return $something;
    }

}

नोट डेटाबेस में तालिकाओं के साथ संबंध बनाने के प्रयास के बारे में सावधान रहें! यह करना संभव है, लेकिन यह कुछ कैविटीज़ के साथ आ सकता है और इस बात पर निर्भर करता है कि आपके पास कौन सा डेटाबेस और / या डेटाबेस सेटिंग्स हैं।


लारवेल डॉक्स से

एकाधिक डेटाबेस कनेक्शन का उपयोग करना

कई कनेक्शनों का उपयोग करते समय, आप प्रत्येक connectionको कनेक्शन विधि के माध्यम से एक्सेस कर सकते हैं DB। इस विधि को nameपारित connectionअपनी config/database.phpविन्यास फाइल में सूचीबद्ध एक कनेक्शन के अनुरूप होना चाहिए :

$users = DB::connection('foo')->select(...);

आप कनेक्शन उदाहरण पर getPdo विधि का उपयोग करके कच्चे, अंतर्निहित PDO उदाहरण तक भी पहुँच सकते हैं:

$pdo = DB::connection()->getPdo();

उपयोगी कड़ियाँ

  1. Laravel 5 कई डेटाबेस कनेक्शन FROM laracasts.com
  2. लारवल FROM में कई डेटाबेस कनेक्ट करें tutsnare.com
  3. Laravel FROM में कई DB कनेक्शन fideloper.com

1
जब आप डेटाबेस में नया DB विन्यास सरणी class SomeModel extends Model { बना रहे हों, तो आप यह सुनिश्चित कर सकते हैं कि आपने env फ़ाइल से मान निकाले हैं या नहीं। यह भी env('DB_DATABASE', 'name')बताएं कि @sba ने जैसा उल्लेख किया है
Sadee

1
अरे, मैं लुमेन का उपयोग कर रहा हूं और डेटाबेस कॉन्फिग भाग के लिए, मेरे पास केवल ".env" फाइल है। डेटाबेस नहीं। php। तो मैं इसे कैसे ठीक कर सकता हूं?
चनाका डी सिल्वा

1
@ChanakaDeSilva आप लूमेन के लिए बस एक विन्यास फ़ोल्डर और एक डेटाबेस बनाते हैं। जाहिर तौर पर लुमेन लगातार यह देखने के लिए जाँच कर रहा है कि क्या वह फ़ाइल मौजूद है, और यदि ऐसा है तो उसका उपयोग करेगा।
एकेस्टर

2
धन्यवाद भाई मुझे लगता है कि मैं अब यह काम
लेता हूं

1
@AbdullaNilam some1 मेरे पास मल्टीडब ऐप बनाने के लिए आया था, पहले मुझे लगा कि क्या मुझे पता है कि क्या यह संभव है अब मुझे इसका सरल पता है, पी
बिनर

12

लारवेल 5.1 में, आप कनेक्शन निर्दिष्ट करते हैं:

$users = DB::connection('foo')->select(...);

डिफ़ॉल्ट, लारवेल डिफ़ॉल्ट कनेक्शन का उपयोग करता है। यह सरल है, है ना?

यहां पढ़ें: http://laravel.com/docs/5.1/database#accessing-connections


लारवेल 5.1 में, एलोकेंट के बारे में क्या?
सिमो

1
@ सिमो, अब्दुल्ला का जवाब देखें।
schellingerht

मैंने सैम के लिए एक पूरा लेख लिखा है, जिसे आप <a href=" stackcoder.in/posts/… 7.x पर एकाधिक डेटाबेस कनेक्शंस, माइग्रेशन, रिलेशनशिप और
क्वेरीइंग बुटीक

6

वास्तव में, DB::connection('name')->select(..)मेरे लिए काम नहीं करता, क्योंकि 'नाम' को दोहरे उद्धरण चिह्नों में होना चाहिए: "नाम"

फिर भी, मेरे डिफ़ॉल्ट कनेक्शन पर चयन क्वेरी निष्पादित की जाती है। फिर भी यह पता लगाने की कोशिश की जा रही है कि लारवेल को इस तरीके से काम करने के लिए कैसे राजी किया जाए: कनेक्शन को बदल दें।

संपादित करें: मुझे यह समझ में आया। Laravels DatabaseManager को डीबग करने के बाद यह मेरे डेटाबेस को समाप्त कर देता है। (config फाइल) (इस $ के भीतर-> ऐप) गलत था। "कनेक्शन" के अनुभाग में मेरे पास "डेटाबेस" जैसे सामान थे जिनके साथ मैंने इसे कॉपी किया था। के बजाय स्पष्ट शब्दों में

env('DB_DATABASE', 'name')

मुझे कुछ ऐसा करने की जरूरत थी

'myNewName'

चूंकि सभी कनेक्शन डेटाबेस, उपयोगकर्ता नाम, पासवर्ड, आदि के लिए समान मानों के साथ सूचीबद्ध किए गए थे, अगर मैं कम से कम किसी अन्य डेटाबेस नाम का उपयोग करना चाहता हूं, तो बेशक इससे कोई मतलब नहीं है।

इसलिए, हर बार जब मैं किसी अन्य डेटाबेस से कुछ चुनना चाहता था तो मैंने हमेशा अपने डिफ़ॉल्ट डेटाबेस में समाप्त किया


1
धन्यवाद! आपने मेरी पवित्रता को बचाया। मैंने यह पता लगाने की कोशिश की कि मेरे सभी प्रश्नों को डिफ़ॉल्ट डेटाबेस में क्यों भेजा गया है। तब मैंने आपकी पोस्ट पढ़ी और महसूस किया, कि env ने हमेशा .env मानों को लौटाया और दूसरा पैरामीटर केवल एक फॉलबैक था जिसका उपयोग Laravel ने किया था।
मोह

ऑफ-टॉपिक: यह बहुत अच्छा होगा, अगर एड्मिन्ट मेरे पोस्ट में हेरफेर नहीं करेगा। या कम से कम मुझे एक निजी संदेश लिखें कि वे क्या और क्यों बदलना चाहते हैं। मैं निजी संदेश भेजने के लिए पता नहीं था।
सबा

मुझे एक समान समस्या थी, मैंने मूल्य को बदल दिया, लेकिन कुंजी को नहीं। यह इस तरह से काम करता है: 'डेटाबेस' => env ('DB_NEW_DATABASE', 'myNewDatabase))। अच्छी तरह से ध्यान दिया!
फेलिप सेंस

0

Laravel में कई डेटाबेस सिस्टम के लिए इनबिल्ट सपोर्ट है, आपको config / database.php फ़ाइल में कनेक्शन विवरण प्रदान करना होगा

return [
    'default' => env('DB_CONNECTION', 'mysql'),

    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],
'mysqlOne' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST_ONE', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE_ONE', 'forge'),
            'username' => env('DB_USERNAME_ONE', 'forge'),
            'password' => env('DB_PASSWORD_ONE', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
        ],
];

एक बार आपके पास यह होने पर आप प्रत्येक कनेक्शन के लिए दो आधार मॉडल वर्ग बना सकते हैं और उन मॉडलों में कनेक्शन नाम को परिभाषित कर सकते हैं

//BaseModel.php
protected $connection = 'mysql';

//BaseModelOne.php
protected $connection = 'mysqlOne';

आप प्रत्येक DB में तालिकाओं के लिए अधिक मॉडल बनाने के लिए इन मॉडलों का विस्तार कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.