Multiple DB Connections trong Laravel

Ở bài viết này tôi xin giới thiệu 1 cách đơn giản để sử dụng 2 kết nối cơ sở dữ liệu trong Laravel.

Bài viết này sử dụng cơ sở dữ liệu với các dữ liệu khác nhau, không cần thiết để cân bằng tải (hoặc kết nối tổng hợp) giữa các cơ sở dữ liệu.

Định nghĩa kết nối

Bên trong tệp tin cấu hình cơ sở dữ liệu của bạn - có thể là app / config / database.php - bạn có thể định nghĩa nhiều kết nối cơ sở dữ liệu của bất kỳ loại nào. Trên thực tế, bạn có thể định nghĩa nhiều kết nối như bạn muốn. Ví dụ, nếu ứng dụng của bạn phải kéo dữ liệu từ 2 cơ sở dữ liệu MySQL, bạn có thể định nghĩa chúng :

<?php
return array(

    'default' => 'mysql',

    'connections' => array(

        # Our primary database connection
        'mysql' => array(
            'driver'    => 'mysql',
            'host'      => 'host1',
            'database'  => 'database1',
            'username'  => 'user1',
            'password'  => 'pass1'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),

        # Our secondary database connection
        'mysql2' => array(
            'driver'    => 'mysql',
            'host'      => 'host2',
            'database'  => 'database2',
            'username'  => 'user2',
            'password'  => 'pass2'
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
        ),
    ),
);

Chúng ta có kết nối mặc định vẫn thiết lập với mysql. Điều này có nghĩa là, trừ khi chúng ta chỉ định khác, ứng dụng sẽ sử dụng kết nối mysql.

Chỉ định kết nối

Bây giờ chúng ta có một thiết lập kết nối cơ sở dữ liệu thứ hai - làm thế nào để chúng ta sử dụng nó trong code?

Có một vài cách.

  1. Schema

Trong Schema Builder, bạn có thể sử dụng Schema facade với bất kỳ kết nối nào. Để chỉ định kết nối để sử dụng, chỉ cần chạy phương thức connection ():

Schema::connection('mysql2')->create('some_table', function($table)
{
    $table->increments('id'):
});
  1. Query Tương tự như Schema Builder, bạn có thể định nghĩa một kết nối trên Query Builder:
$users = DB::connection('mysql2')->select(...);
  1. Eloquent

Bạn cũng có thể xác định những kết nối để sử dụng trong các model Eloquent của bạn

Một cách là thiết lập biến $connection trong model của bạn:

<?php

class SomeModel extends Eloquent {

    protected $connection = 'mysql2';

}

Bạn cũng có thể định nghĩa kết nối tại thời gian chạy thông qua phương thức setConnection.

<?php

class SomeController extends BaseController {

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

        $someModel->setConnection('mysql2');

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

        return $something;
    }

}

Hãy cẩn thận về việc cố gắng để xây dựng mối quan hệ giữa các bảng trên các cơ sở dữ liệu khác nhau. Có thể làm, nhưng nó có thể đi kèm với một số lưu ý và phụ thuộc vào cơ sở dữ liệu hoặc cài đặt cơ sở dữ liệu bạn có.