Cách sử dụng nhiều cơ sở dữ liệu trong Laravel


225

Tôi muốn kết hợp nhiều cơ sở dữ liệu trong hệ thống của tôi. Hầu hết thời gian cơ sở dữ liệu là MySQL; nhưng nó có thể khác trong tương lai, tức là Quản trị viên có thể tạo một báo cáo như vậy sử dụng nguồn của hệ thống cơ sở dữ liệu không đồng nhất .

Vì vậy, câu hỏi của tôi là liệu Laravel có cung cấp Mặt tiền nào để xử lý các tình huống như vậy không? Hoặc bất kỳ khuôn khổ khác có khả năng phù hợp hơn cho vấn đề là?

Câu trả lời:


469

Sử dụng .env> = 5.0 (đã thử nghiệm trên 5.5)

Trong .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

Trong 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'),
],

Lưu ý: Trong trường mysql2hợp DB_username và DB_password giống nhau, thì bạn có thể sử dụng env('DB_USERNAME')được đánh giá trong .envvài dòng đầu tiên.

Không có .env<5.0

Xác định kết nối

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

Lược đồ

Để chỉ định sử dụng kết nối nào, chỉ cần chạy connection()phương thức

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

Trình tạo truy vấn

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

Hiệu quả

Đặt $connectionbiến trong mô hình của bạn

class SomeModel extends Eloquent {

    protected $connection = 'mysql2';

}

Bạn cũng có thể xác định kết nối trong thời gian chạy thông qua setConnectionphương thức hoặc onphương thức tĩnh:

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;
    }

}

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


Từ tài liệu của Laravel

Sử dụng nhiều kết nối cơ sở dữ liệu

Khi sử dụng nhiều kết nối, bạn có thể truy cập từng connectionkết nối thông qua phương thức kết nối trên DBmặt tiền. Truyền namecho connectionphương thức phải tương ứng với một trong các kết nối được liệt kê trong config/database.phptệp cấu hình của bạn :

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

Bạn cũng có thể truy cập vào thể hiện PDO thô, cơ bản bằng cách sử dụng phương thức getPdo trên một thể hiện kết nối:

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

Liên kết hữu ích

  1. Kết nối nhiều cơ sở dữ liệu của Laravel 5 TỪ laracasts.com
  2. Kết nối nhiều cơ sở dữ liệu trong laravel TỪ tutsnare.com
  3. Nhiều kết nối DB trong Laravel TỪ fideloper.com

1
Bạn có thể sử dụng class SomeModel extends Model { và cũng đảm bảo rằng bạn đã xóa các giá trị từ tệp env như env('DB_DATABASE', 'name')khi bạn tạo mảng cấu hình DB mới trong tệp cơ sở dữ liệu như @sba đã đề cập
Sadee

1
Xin chào, tôi đang sử dụng Lumen và đối với phần cấu hình cơ sở dữ liệu, tôi chỉ có tệp ".env". Không phải cơ sở dữ liệu.php. Vì vậy, làm thế nào tôi có thể khắc phục điều này?
Chanaka De Silva

1
@ChanakaDeSilva Bạn chỉ cần tạo một thư mục cấu hình và tệp tin cơ sở dữ liệu trong đó cho Lumen. Rõ ràng Lumen liên tục kiểm tra xem liệu tập tin đó có tồn tại hay không và sẽ sử dụng nó nếu có.
Ecksters

2
Cảm ơn bạn tôi nghĩ tôi nhận công việc này ngay bây giờ; p
binar

1
@AbdullaNilam some1 đã đến với tôi để tạo ra ứng dụng multidb đầu tiên là tôi không biết liệu bây giờ có thể không, tôi biết nó đơn giản; p
binar

12

Trong Laravel 5.1, bạn chỉ định kết nối:

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

Mặc định, Laravel sử dụng kết nối mặc định. Nó đơn giản phải không?

Đọc thêm tại đây: http://laravel.com/docs/5.1/database#accessing-connections


trong Laravel 5.1, còn Eloquent thì sao?
simo

1
@simo, xem câu trả lời của Abdulla.
schellingerht

Tôi đã viết một bài viết hoàn chỉnh cho sam, bạn có thể kiểm tra nó tại <a href=" stackcoder.in/posts/iêu 7.x Nhiều kết nối cơ sở dữ liệu, Di chuyển, Mối quan hệ & Truy
vấn</a>

6

Trên thực tế, DB::connection('name')->select(..)không hoạt động đối với tôi, vì 'tên' phải nằm trong dấu ngoặc kép: "tên"

Tuy nhiên, truy vấn chọn được thực hiện trên kết nối mặc định của tôi. Vẫn đang cố gắng tìm ra cách thuyết phục Laravel làm việc theo cách nó được dự định: thay đổi kết nối.

Chỉnh sửa: Tôi đã tìm ra nó. Sau khi gỡ lỗi Trình quản lý cơ sở dữ liệu của Laravels, hóa ra cơ sở dữ liệu của tôi.php (tệp cấu hình) (bên trong $ this-> ứng dụng) đã sai. Trong phần "kết nối", tôi có những thứ như "cơ sở dữ liệu" với các giá trị của cái tôi đã sao chép nó từ đó. Nói một cách rõ ràng, thay vì

env('DB_DATABASE', 'name')

Tôi cần đặt một cái gì đó như

'myNewName'

vì tất cả các kết nối được liệt kê với cùng các giá trị cho cơ sở dữ liệu, tên người dùng, mật khẩu, v.v ... tất nhiên điều này rất ít có ý nghĩa nếu tôi muốn truy cập ít nhất một tên cơ sở dữ liệu khác

Do đó, mỗi lần tôi muốn chọn thứ gì đó từ cơ sở dữ liệu khác, tôi luôn kết thúc trong cơ sở dữ liệu mặc định của mình


1
Cảm ơn bạn! Bạn đã cứu sự tỉnh táo của tôi. Tôi đã cố gắng tìm hiểu tại sao tất cả các truy vấn của tôi đề cập đến cơ sở dữ liệu mặc định. Sau đó tôi đọc bài đăng của bạn và nhận ra rằng env luôn trả về các giá trị .env và tham số thứ hai chỉ là một dự phòng mà Laravel không sử dụng.
Moha

Off-topic: sẽ thật tuyệt, nếu quản trị viên không thao túng bài viết của tôi. Hoặc ít nhất viết cho tôi một tin nhắn riêng tư những gì và tại sao họ muốn thay đổi. Tôi đã không tìm ra làm thế nào để gửi tin nhắn cá nhân.
sba

Tôi đã có một vấn đề tương tự, tôi đã thay đổi giá trị nhưng không phải là chìa khóa. Nó hoạt động như thế này: 'cơ sở dữ liệu' => env ('DB_NEW_DATABASE', 'myNewDatabase'). Cũng lưu ý!
Fellipe Sanches

0

Laravel có hỗ trợ sẵn có cho nhiều hệ thống cơ sở dữ liệu, bạn cần cung cấp chi tiết kết nối trong tệp 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,
        ],
];

Khi bạn đã có điều này, bạn có thể tạo hai lớp mô hình cơ sở cho mỗi kết nối và xác định tên kết nối trong các mô hình đó

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

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

Bạn có thể mở rộng các mô hình này để tạo thêm các mô hình cho các bảng trong mỗi DB.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.