cod*_*ken 10 php database-migration laravel-4
我在一个使用多个数据库的项目中工作.看起来Laravel只使用设置为默认值的数据库中的migrations-table.我希望每个数据库有一个迁移表,用于记录已对该特定数据库执行的迁移.这可能吗?
我在配置中定义了数据库,如下所示:
'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',
]
],
Run Code Online (Sandbox Code Playgroud)
我还将第一个数据库(db1)设为默认数据库
'default' => 'db1'
Run Code Online (Sandbox Code Playgroud)
我在两个数据库上安装迁移表
artisan migrate:install --database=db1
artisan migrate:install --database=db2
Run Code Online (Sandbox Code Playgroud)
之后,我继续创建几个数据库特定的迁移
在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');
}
}
Run Code Online (Sandbox Code Playgroud)
在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');
}
}
Run Code Online (Sandbox Code Playgroud)
我现在运行迁移
artisan migrate
Run Code Online (Sandbox Code Playgroud)
+-----------------------------+-------+
| migration | batch |
+-----------------------------+-------+
| create_test1_table_in_db1 | 1 |
+-----------------------------+-------+
Run Code Online (Sandbox Code Playgroud)
+-----------------------------+-------+
| migration | batch |
+-----------------------------+-------+
| create_test2_table_in_db2 | 1 |
+-----------------------------+-------+
Run Code Online (Sandbox Code Playgroud)
+-----------------------------+-------+
| migration | batch |
+-----------------------------+-------+
| create_test1_table_in_db1 | 1 |
| create_test2_table_in_db2 | 1 |
+-----------------------------+-------+
Run Code Online (Sandbox Code Playgroud)
+-----------------------------+-------+
| migration | batch |
+-----------------------------+-------+
Empty set
Run Code Online (Sandbox Code Playgroud)
Bog*_*dan 26
将该--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"
Run Code Online (Sandbox Code Playgroud)
这样,您的migrations表将对每个数据库独立.
如果您想要更进一步并自动化该过程,您可以创建自定义命令,该命令将立即运行所有迁移.您可以像这样创建命令(make:console用于Laravel 5.0至5.2或make:commandLaravel 5.2+):
artisan command:make MigrateAllCommand --command=migrate:all
Run Code Online (Sandbox Code Playgroud)
这将创建一个新文件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));
}
}
Run Code Online (Sandbox Code Playgroud)
只要数据库配置密钥的名称与迁移目录名称相同,这将起作用.然后你可以像这样调用它:
artisan migrate:all
Run Code Online (Sandbox Code Playgroud)
您可以查看Laravel Command Docs以获取更多信息.