每个数据库使用一个 Laravel 迁移表

2022-08-30 22:56:48

我在一个使用多个数据库的项目中工作。Laravel 似乎只使用数据库中设置为默认值的迁移表。我希望每个数据库都有一个迁移表,用于记录已对该特定数据库进行的迁移。这可能吗?

我已经在配置中定义了数据库,如下所示:

'connections' => [
    'db1' => array(
        'driver'    => 'mysql',
        'host'      => 'db1.host',
        'database'  => 'db1',
        'username'  => 'username',
        'password'  => 'password',
    ),
    'db2' => [
        'driver'    => 'mysql',
        'host'      => 'db2.host',
        'database'  => 'db2',
        'username'  => 'username',
        'password'  => 'password',
    ]
],

我还使第一个数据库(db1)成为默认数据库

'default' => 'db1'

我在两个数据库上都安装了迁移表

artisan migrate:install --database=db1
artisan migrate:install --database=db2

之后,我继续创建几个数据库特定迁移

在 db1 数据库中创建表 test1:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTest1Table extends Migration
{
    public function up()
    {
        Schema::connection('db1')->create('test1', function(Blueprint $table)
        {
            $table->increments('id')->unsigned();
        });
    }

    public function down()
    {
        Schema::connection('db1')->drop('test1');
    }
}

在 db2 数据库中创建表 test2:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTest2Table extends Migration
{
    public function up()
    {
        Schema::connection('db2')->create('test2', function(Blueprint $table)
        {
            $table->increments('id')->unsigned();
        });
    }

    public function down()
    {
        Schema::connection('db2')->drop('test2');
    }
}

我现在运行迁移

artisan migrate

预期成果

db1.迁移

+-----------------------------+-------+
| migration                   | batch |
+-----------------------------+-------+
| create_test1_table_in_db1   |     1 |
+-----------------------------+-------+

db2.迁移

+-----------------------------+-------+
| migration                   | batch |
+-----------------------------+-------+
| create_test2_table_in_db2   |     1 |
+-----------------------------+-------+

实际结果

db1.迁移

+-----------------------------+-------+
| migration                   | batch |
+-----------------------------+-------+
| create_test1_table_in_db1   |     1 |
| create_test2_table_in_db2   |     1 |
+-----------------------------+-------+

db2.迁移

+-----------------------------+-------+
| migration                   | batch |
+-----------------------------+-------+
Empty set

答案 1

关于在Laravel中使用多个数据库的文章 - https://stackcoder.in/posts/laravel-7x-multiple-database-connections-migrations-relationships-querying

将参数与命令一起使用,并将每个数据库的迁移存储在单独的目录中。--databasemigrate

您可以为每个数据库设置单独的目录(在您的情况下是 和 ),并将相应的迁移存储在每个目录中。然后,您可以像这样运行迁移:app/database/migrationsdb1db2

artisan migrate --database="db1" --path="app/database/migrations/db1"
artisan migrate --database="db2" --path="app/database/migrations/db2"

这样,您的表对于每个数据库都是独立的。migrations

如果您想加倍努力并自动执行该过程,则可以创建自定义命令,该命令将一次运行所有迁移。您可以创建如下命令(用于 Laravel 5.0 到 5.2 或 Laravel 5.2+):make:consolemake:command

artisan command:make MigrateAllCommand --command=migrate:all

这将创建一个新文件 。命令的方法将如下所示:app/commands/MigrateAllCommand.phpfire

public function fire()
{
    foreach (Config::get('database.connections') as $name => $details)
    {
        $this->info('Running migration for "' . $name . '"');
        $this->call('migrate', array('--database' => $name, '--path' => 'app/database/migrations/' . $name));
    }
}

如果数据库配置键的名称与迁移目录名称相同,这将起作用。然后,您可以这样称呼它:

artisan migrate:all

您可以查看 Laravel 命令文档以获取更多信息。


答案 2

推荐