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

2022-08-30 18:05:38

我正在尝试在Laravel 4.2中创建一个模型并为该模型进行迁移。我所有的Laravel应用程序都使用相同的MySQL数据库,称为.但是,我们还有另一个数据库(在同一台服务器上),称为包含一个表,我想用它来获取数据库中我自己的表中的几个外键的源。laravelmain_dbuserslaravel_userslaravel

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

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

但我相信这假设该表存在于同一数据库中。'users'

是否可以在Laravel中执行跨数据库外键?我是否必须首先创建一个使用表的模型?是否可以在 中设置两个不同的数据库连接?usersmain_dbapp/config/database.php


答案 1

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

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

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

如果遇到错误,请检查列类型是否相同。(您不能将 varchar 引用为 int,反之亦然,键的类型必须相同)。


答案 2

如果将来更改数据库的名称,这将不起作用,以供将来参考。最好通过数据库定义来获取数据库的名称。

配置/数据库.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'));
});

推荐