Используйте одну таблицу миграции Laravel для каждой базы данных

Я работаю в проекте, который использует несколько баз данных. Кажется, что Laravel использует таблицу migrations в базе данных, которая задана по умолчанию. Я бы хотел, чтобы одна таблица миграции на каждую базу данных регистрировала миграции, которые были сделаны для этой конкретной базы данных. Это возможно?

Я определил базы данных в config следующим образом:

'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 

После этого я приступаю к созданию пары спецификаций базы данных

Создать таблицу test1 в базе данных db1:

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

Создать таблицу test2 в базе данных db2:

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

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

db2.migrations

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

Фактический результат

db1.migrations

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

db2.migrations

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

Используйте параметр --database с помощью команды migrate и --database миграцию для каждой базы данных в отдельных каталогах.

У вас могут быть отдельные каталоги в app/database/migrations для каждой из ваших баз данных (в вашем случае db1 и db2 ) и хранить соответствующие миграции в каждом каталоге. Затем вы можете выполнить миграцию следующим образом:

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

Таким образом, ваша таблица migrations будет независимой для каждой базы данных.

Если вы хотите пройти лишнюю милю и автоматизировать процесс, вы можете создать свою собственную команду, которая будет запускать все миграции одновременно. Вы можете создать команду следующим образом:

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

Это создаст новое app/commands/MigrateAllCommand.php . Метод fire вашей команды будет выглядеть примерно так:

 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 Command Docs для получения дополнительной информации.