Я работаю в проекте, который использует несколько баз данных. Кажется, что 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
После этого я продолжаю создавать пару специфичных для базы данных миграций.
Создайте таблицу 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
Команда и сохранить миграции для каждой базы данных в отдельных каталогах.
Вы можете иметь отдельные каталоги в app/database/migrations
для каждой вашей базы данных (в вашем случае db1
а также db2
) и сохраните соответствующие миграции в каждом каталоге. Тогда вы можете запустить миграцию так:
artisan migrate --database="db1" --path="app/database/migrations/db1"artisan migrate --database="db2" --path="app/database/migrations/db2"
Таким образом, ваш migrations
Таблица будет независимой для каждой базы данных.
Если вы хотите пройти лишнюю милю и автоматизировать процесс, вы можете создать свою собственную команду, которая будет запускать все миграции одновременно. Вы можете создать команду, как это (используйте make:console
для Laravel 5.0 до 5.2 или make:command
для Laravel 5.2+):
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 для получения дополнительной информации.
Других решений пока нет …