我在使用多个数据库的项目中工作。看来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
+-----------------------------+-------+ | 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
migrate
您可以app/database/migrations为每个数据库(在db1和中db2)分别拥有单独的目录,并将适当的迁移存储在每个目录中。然后,您可以像这样运行迁移:
app/database/migrations
db1
db2
artisan migrate --database="db1" --path="app/database/migrations/db1" artisan migrate --database="db2" --path="app/database/migrations/db2"
这样,您的migrations表将对每个数据库都是独立的。
migrations
如果您要加倍努力并实现流程自动化,则可以创建自定义命令,该命令将一次运行所有迁移。您可以创建如下命令(make:console用于Laravel 5.0到5.2或make:commandLaravel 5.2+):
make:console
make:command
artisan command:make MigrateAllCommand --command=migrate:all
这将创建一个新文件app/commands/MigrateAllCommand.php。您的命令的fire方法如下所示:
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命令文档以获取更多信息。