Я работаю в проекте, который использует несколько баз данных. Кажется, что 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
+-----------------------------+-------+ | migration | batch | +-----------------------------+-------+ | create_test1_table_in_db1 | 1 | +-----------------------------+-------+
+-----------------------------+-------+ | migration | batch | +-----------------------------+-------+ | create_test2_table_in_db2 | 1 | +-----------------------------+-------+
+-----------------------------+-------+ | migration | batch | +-----------------------------+-------+ | create_test1_table_in_db1 | 1 | | create_test2_table_in_db2 | 1 | +-----------------------------+-------+
+-----------------------------+-------+ | 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 для получения дополнительной информации.