Php 每个数据库使用一个Laravel migrations表

Php 每个数据库使用一个Laravel migrations表,php,laravel-4,database-migration,Php,Laravel 4,Database Migration,我在一个使用多个数据库的项目中工作。似乎Laravel只使用数据库中设置为默认值的migrations表。我希望每个数据库有一个迁移表,记录对该特定数据库进行的迁移。这可能吗 我在配置中定义了如下数据库: 'connections' => [ 'db1' => array( 'driver' => 'mysql', 'host' => 'db1.host', 'database' => 'db

我在一个使用多个数据库的项目中工作。似乎Laravel只使用数据库中设置为默认值的migrations表。我希望每个数据库有一个迁移表,记录对该特定数据库进行的迁移。这可能吗

我在配置中定义了如下数据库:

'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',
    ]
],
artisan migrate --database="db1" --path="app/database/migrations/db1"
artisan migrate --database="db2" --path="app/database/migrations/db2"
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
我还将第一个数据库(db1)设为默认数据库

'default' => 'db1'
我在两个数据库上都安装了migrations表

artisan migrate:install --database=db1
artisan migrate:install --database=db2
之后,我继续创建两个特定于数据库的迁移

artisan migrate
在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');
    }
}
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');
    }
}
在db2数据库中创建表test2:

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');
    }
}
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.1迁移 db2.migrations 实际结果 db1.1迁移 db2.migrations 将
--database
参数与
migrate
命令一起使用,并将每个数据库的迁移存储在单独的目录中

您可以在
app/database/migrations
中为每个数据库(在您的例子中是
db1
db2
)设置单独的目录,并在每个目录中存储适当的迁移。然后您可以像这样运行迁移:

'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',
    ]
],
artisan migrate --database="db1" --path="app/database/migrations/db1"
artisan migrate --database="db2" --path="app/database/migrations/db2"
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 5.0到5.2版本,使用
make:console
,或者对于Laravel 5.2+,使用
make:command

这将创建一个新文件
app/commands/MigrateAllCommand.php
。命令的
fire
方法如下所示:

'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',
    ]
],
artisan migrate --database="db1" --path="app/database/migrations/db1"
artisan migrate --database="db2" --path="app/database/migrations/db2"
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
如果数据库配置密钥的名称与迁移目录名称相同,则此操作将起作用。你可以这样称呼它:

'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',
    ]
],
artisan migrate --database="db1" --path="app/database/migrations/db1"
artisan migrate --database="db2" --path="app/database/migrations/db2"
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

您可以查看以了解更多信息。

刚刚意识到,为每个数据库设置一个有关回滚的迁移表可能不是一个好主意。假设您有三个数据库,最近的迁移导致其中两个数据库发生了更改。当您想要回滚时,您不再知道需要回滚哪些数据库,因为不再有全局批号。想法?这主要取决于你的需要。如果您的应用程序的数据存储结构分布在多个服务器之间(出于性能或其他原因),那么您只需要一个通用迁移文件。但是,如果您有可能只使用一台服务器上的数据库的较小的应用程序/模块,并且您希望独立地更新它们,那么拥有单独的迁移表将是有益的(请记住,
migrate:rollback
还具有
--database
参数)方法,而不是
fire()
+路径应该没有
app/
前缀,只有
'database/migrations/'$name
我已经为sam写了一篇完整的文章,您可以在7.x多数据库连接、迁移、关系和查询中查看它