2015-03-09 21 views
6

Tôi đang cố tạo mô hình và di chuyển cho mô hình đó trong Laravel 4.2. Tất cả các ứng dụng Laravel của tôi sử dụng cùng một cơ sở dữ liệu MySQL được gọi là laravel. Tuy nhiên, chúng tôi cũng có một cơ sở dữ liệu khác (trên cùng một máy chủ), được gọi là main_db có chứa một bảng users, mà tôi muốn sử dụng cho nguồn của một vài khóa ngoài trong bảng laravel_users của riêng mình trong cơ sở dữ liệu laravel.Có thể tham chiếu khóa ngoại trong cơ sở dữ liệu khác trong Laravel không?

Theo tài liệu Laravel, tôi sẽ chỉ định một chính nước ngoài với mã này:

$table->foreign('user_id')->references('id')->on('users'); 

Nhưng tôi tin rằng điều này giả định rằng các bảng 'users' tồn tại trong cơ sở dữ liệu tương tự.

Có thể thực hiện các khóa ngoại vi dữ liệu xuyên trong Laravel không? Trước tiên, tôi có phải tạo mô hình sử dụng bảng users từ main_db không? Và có thể thiết lập hai kết nối cơ sở dữ liệu khác nhau trong app/config/database.php không?

Trả lời

13

Các khóa ngoại vi cơ sở dữ liệu chéo không liên quan nhiều đến Laravel. Câu hỏi thực sự là nếu cơ sở dữ liệu hỗ trợ nó. Và MySQL (ít nhất là với InnoDB) không hỗ trợ các ràng buộc khóa ngoài đối với nhiều cơ sở dữ liệu. Bạn chỉ cần xác định cơ sở dữ liệu với ký hiệu dấu chấm: db.table.

Về xây dựng giản đồ Laravel, điều này sẽ làm việc:

$table->foreign('user_id')->references('id')->on('main_db.users'); 
//            ^^^^^^^ 
+0

Oh wow. Tôi yêu nó khi mọi thứ đến với nhau một cách rõ ràng. Cảm ơn nhiều. Chỉ cần làm rõ mặc dù, sau đó tôi sẽ phải thêm ký hiệu chấm cho mỗi cơ sở dữ liệu về sau? I E. tất cả các mô hình Laravel trước đây của tôi sẽ phải sử dụng 'laravel.xxxx' từ đây trở đi ...? – cchapman

+1

Bạn được chào đón. Không, bạn chỉ phải chỉ định db nếu nó khác với db mà bảng bạn đang thêm khóa vào. – lukasgeiter

2

Để tham khảo trong tương lai nếu bạn đã bao giờ thay đổi tên của cơ sở dữ liệu này sẽ không hoạt động. Tốt nhất là lấy tên của cơ sở dữ liệu theo định nghĩa cơ sở dữ liệu.

config/database.php

'auth_database' => [ 
    'driver' => 'mysql', 
    'host' => env('DB_HOST', 'localhost'), 
    '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, 
], 

Sau đó, trong tập tin chuyển đổi của bạn:

Schema::create('role_user', function (Blueprint $table) { 
    $db = DB::connection('auth_database')->getDatabaseName(); 

    $table->integer('role_id')->unsigned(); 
    $table->foreign('role_id')->references('id')->on('roles'); 
    $table->integer('user_id')->unsigned(); 
    $table->foreign('user_id')->references('id')->on(new Expression($db . '.users')); 
}); 
+0

Đó là một cách tuyệt vời để làm điều đó! cảm ơn bạn –

0

trả lời của @lukasgeiter làm việc cho tôi với sau hai thay đổi:

1- Tôi đã thay đổi cả hai công cụ cơ sở dữ liệu thành InnoDB.

2- Tôi phải đặt khóa ngoài là Số nguyên chưa được ký trong tệp di chuyển vì tham chiếu là số nguyên không dấu và là khóa chính.

$table->integer('user_id')->unsigned()->change(); 
Các vấn đề liên quan