是否可以在Laravel中的不同数据库中引用外键?

时间:2015-03-09 19:18:18

标签: php mysql laravel laravel-4

我正在尝试在Laravel 4.2中为该模型创建模型和迁移。我的所有Laravel应用程序都使用名为laravel的相同MySQL数据库。但是,我们还有另一个数据库(在同一台服务器上),名为main_db,包含一个users表,我想用它作为我自己{{1}中几个外键的来源。 laravel_users数据库中的表。

根据Laravel文档,我将使用以下代码指定一个外键:

laravel

但我相信这假设$table->foreign('user_id')->references('id')->on('users'); 表存在于同一个数据库中。

是否可以在Laravel中执行跨数据库外键?我是否必须先创建一个使用'users' users表格的模型?是否可以在main_db

中设置两个不同的数据库连接

3 个答案:

答案 0 :(得分:21)

交叉数据库外键实际上与Laravel没什么关系。真正的问题是数据库是否支持它。 MySQL(至少使用InnoDB)确实支持多个数据库中的外键约束。您只需使用点表示法指定数据库:db.table

关于Laravel架构构建器,这应该有效:

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

答案 1 :(得分:9)

如果您更改了数据库的名称,以备将来参考,这将无效。最好通过数据库定义获取数据库的名称。

配置/ 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,
],

然后在您的迁移文件中:

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

答案 2 :(得分:1)

@ lukasgeiter 的回答对我有用,有以下两点变化:

1-我将两个数据库引擎都更改为 InnoDB

2-我必须在迁移文件中将外键设置为无符号整数,因为引用是无符号整数并且是主键。

$table->integer('user_id')->unsigned()->change();