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

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

Ожидаемый результат

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

7

Решение

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

15

Другие решения

Других решений пока нет …