วิธีใช้หลายฐานข้อมูลใน Laravel


225

ฉันต้องการรวมหลายฐานข้อมูลในระบบของฉัน ส่วนใหญ่แล้วฐานข้อมูลคือ MySQL แต่มันอาจแตกต่างกันในอนาคตเช่นผู้ดูแลระบบสามารถสร้างรายงานดังกล่าวซึ่งใช้แหล่งที่มาของระบบฐานข้อมูลที่แตกต่างกัน

ดังนั้นคำถามของฉันคือLaravel ให้ส่วนหน้าใด ๆเพื่อจัดการกับสถานการณ์เช่นนี้หรือไม่? หรือกรอบอื่น ๆ มีความสามารถที่เหมาะสมกว่าสำหรับปัญหาคืออะไร?

คำตอบ:


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'    => '',
        ),
    ),
);

schema

ในการระบุการเชื่อมต่อที่จะใช้เพียงใช้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;
    }

}

หมายเหตุระวังการสร้างความสัมพันธ์กับตารางในฐานข้อมูล เป็นไปได้ที่จะทำ แต่อาจมาพร้อมกับ caveats บางอย่างและขึ้นอยู่กับการตั้งค่าฐานข้อมูลและ / หรือฐานข้อมูลที่คุณมี


จาก Laravel Docs

ใช้การเชื่อมต่อฐานข้อมูลหลายรายการ

เมื่อใช้การเชื่อมต่อหลายรายการคุณสามารถเข้าถึงแต่ละรายการconnectionผ่านวิธีการเชื่อมต่อที่DBด้านหน้า การnameส่งผ่านไปยังconnectionเมธอดควรสอดคล้องกับการเชื่อมต่อรายการใดรายการหนึ่งในconfig/database.phpไฟล์กำหนดค่าของคุณ:

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

นอกจากนี้คุณยังสามารถเข้าถึงอินสแตนซ์ PDO พื้นฐานซึ่งใช้เมธอด getPdo บนอินสแตนซ์การเชื่อมต่อ:

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

ลิงค์ที่มีประโยชน์

  1. Laravel 5 เชื่อมต่อฐานข้อมูลหลายตัวจาก laracasts.com
  2. เชื่อมต่อหลายฐานข้อมูลใน laravel FROM tutsnare.com
  3. การเชื่อมต่อฐานข้อมูลหลายรายการใน Laravel FROM fideloper.com

1
คุณสามารถใช้class SomeModel extends Model { และตรวจสอบให้แน่ใจว่าคุณได้ลบค่าออกจากไฟล์ env เช่นเดียวกับenv('DB_DATABASE', 'name')เมื่อคุณสร้างอาเรย์การกำหนดค่า DB ใหม่ในไฟล์ database.php ตามที่ @sba ได้กล่าวถึงแล้ว
Sadee

1
สวัสดีฉันกำลังใช้ Lumen และสำหรับส่วนกำหนดค่าฐานข้อมูลฉันมีเฉพาะไฟล์ ".env" ไม่ใช่ database.php ดังนั้นฉันจะแก้ไขได้อย่างไร
Chanaka De Silva

1
@ChanakaDeSilva คุณเพียงแค่สร้างโฟลเดอร์ config และไฟล์ database.php ในนั้นสำหรับ Lumen เห็นได้ชัดว่าลูเมนกำลังตรวจสอบอย่างต่อเนื่องเพื่อดูว่ามีไฟล์นั้นอยู่หรือไม่และจะใช้หากเป็นเช่นนั้น
Ecksters

2
ขอบคุณมากฉันคิดว่าฉันทำงานนี้แล้ว p
binar

1
@AbdullaNilam some1 มาหาฉันเพื่อสร้างแอพพลิเคชั่นคิดแรกคิดว่าฉันไม่รู้ว่ามันเป็นไปได้ตอนนี้ฉันรู้ว่ามันเป็นเรื่องง่าย p
binar

12

ใน Laravel 5.1 คุณระบุการเชื่อมต่อ:

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

เริ่มต้น Laravel ใช้การเชื่อมต่อเริ่มต้น มันง่ายใช่มั้ย

อ่านเพิ่มเติมได้ที่นี่: http://laravel.com/docs/5.1/database#accessing-connections


ใน Laravel 5.1 แล้ว Eloquent ล่ะ?
simo

1
@simo ดูคำตอบของ Abdulla
schellingerht

ฉันได้เขียนบทความฉบับสมบูรณ์สำหรับ sam คุณสามารถตรวจสอบได้ที่ < a href=" stackcoder.in/posts/ … 7.x การเชื่อมต่อฐานข้อมูลหลายรายการการโยกย้ายความสัมพันธ์ & การ
สืบค้น << /

6

อันที่จริงDB::connection('name')->select(..)ไม่ทำงานสำหรับฉันเพราะ 'ชื่อ' จะต้องอยู่ในเครื่องหมายคำพูดคู่: "ชื่อ"

ถึงกระนั้นแบบสอบถามแบบใช้เลือกข้อมูลจะถูกดำเนินการในการเชื่อมต่อเริ่มต้นของฉัน ยังคงพยายามหาวิธีโน้มน้าวใจ Laravel ให้ทำงานตามที่ตั้งใจไว้: เปลี่ยนการเชื่อมต่อ

แก้ไข: ฉันคิดออก หลังจากการดีบัก Laravels DatabaseManager มันเปิดใช้งาน database.php ของฉัน (ไฟล์กำหนดค่า) (ภายในแอพ $ this-> app) ผิด ในส่วน "การเชื่อมต่อ" ฉันมีสิ่งต่าง ๆ เช่น "ฐานข้อมูล" ที่มีค่าของสิ่งที่ฉันคัดลอกมา ในแง่ที่ชัดเจนแทน

env('DB_DATABASE', 'name')

ฉันต้องการที่จะวางบางสิ่งเช่น

'myNewName'

เนื่องจากการเชื่อมต่อทั้งหมดถูกแสดงด้วยค่าเดียวกันสำหรับฐานข้อมูลชื่อผู้ใช้รหัสผ่านและอื่น ๆ ซึ่งแน่นอนว่าเหมาะสมถ้าฉันต้องการเข้าถึงอย่างน้อยชื่อฐานข้อมูลอื่น

ดังนั้นทุกครั้งที่ฉันต้องการเลือกบางสิ่งจากฐานข้อมูลอื่นฉันมักจะลงเอยในฐานข้อมูลเริ่มต้นของฉัน


1
ขอบคุณ! คุณบันทึกสติของฉัน ฉันพยายามที่จะหาสาเหตุที่แบบสอบถามทั้งหมดของฉันอ้างถึงฐานข้อมูลเริ่มต้น จากนั้นฉันอ่านโพสต์ของคุณและรับรู้ว่า env ส่งคืนค่า. env เสมอและพารามิเตอร์ที่สองเป็นเพียงทางเลือกที่ Laravel ไม่ได้ใช้
โมฮา

นอกหัวข้อ: จะดีถ้าผู้ดูแลระบบไม่จัดการกับโพสต์ของฉัน หรืออย่างน้อยก็เขียนข้อความส่วนตัวถึงฉันว่าอะไรคืออะไรและทำไมพวกเขาต้องการเปลี่ยน ฉันไม่เข้าใจวิธีการส่งข้อความส่วนตัว
sba

ฉันมีปัญหาที่คล้ายกันฉันเปลี่ยนค่า แต่ไม่ใช่คีย์ มันทำงานเช่นนี้: 'ฐานข้อมูล' => env ('DB_NEW_DATABASE', 'myNewDatabase') สังเกตได้ดี!
Fellipe Sanches

0

Laravel มีการสนับสนุน inbuilt สำหรับระบบฐานข้อมูลหลายระบบคุณต้องระบุรายละเอียดการเชื่อมต่อในไฟล์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';

คุณสามารถขยายแบบจำลองเหล่านี้เพื่อสร้างแบบจำลองเพิ่มเติมสำหรับตารางในแต่ละฐานข้อมูล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.