每个数据库使用一个 Laravel 迁移表

Posted

技术标签:

【中文标题】每个数据库使用一个 Laravel 迁移表【英文标题】:Use one Laravel migrations table per database 【发布时间】:2014-12-26 14:28:42 【问题描述】:

我在一个使用多个数据库的项目中工作。似乎 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

预期结果

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

【问题讨论】:

刚刚意识到,在回滚方面为每个数据库都有一个迁移表可能是个坏主意。假设您有三个数据库,最新的迁移导致其中两个发生更改。当您想要回滚时,您不再知道需要回滚哪些数据库,因为不再有全局批号。想法? 这主要取决于您的需求。如果您的单个应用程序具有分布在多个服务器之间的数据存储结构(出于性能或您可能有的任何其他原因),那么您只需要一个通用迁移文件。但是,如果您有可能仅在一台服务器上使用数据库的较小应用程序/模块并且您希望独立更新它们,那么拥有单独的迁移表将是有益的(请记住,migrate:rollback 也有 --database 参数)。 【参考方案1】:

关于在 Laravel 中使用多个数据库的文章 - https://stackcoder.in/posts/laravel-7x-multiple-database-connections-migrations-relationships-querying

--database 参数与migrate 命令一起使用,并将每个数据库的迁移存储在单独的目录中。

您可以在app/database/migrations 中为每个数据库(在您的情况下为db1db2)拥有单独的目录,并将适当的迁移存储在每个目录中。然后你可以像这样运行迁移:

artisan migrate --database="db1" --path="app/database/migrations/db1"
artisan migrate --database="db2" --path="app/database/migrations/db2"

这样您的migrations 表将独立于每个数据库。

如果您想加倍努力并自动化该过程,您可以创建自定义命令来一次运行所有迁移。您可以像这样创建命令(对于 Laravel 5.0 到 5.2 使用 make:console 或对于 Laravel 5.2+ 使用 make:command):

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 了解更多信息。

【讨论】:

从 Laravel 5 开始,应该使用handle() 方法,而不是fire()。 + 路径应该没有app/ 前缀,只是'database/migrations/' . $name 我已经为sam写了一篇完整的文章,你可以在stackcoder.in/posts/… 7.x Multiple Database Connections, Migrations, Relationships & Querying查看 @ChannaveerHakari 你错过了种子部分! @francisco 好的,我会尽快介绍这部分。

以上是关于每个数据库使用一个 Laravel 迁移表的主要内容,如果未能解决你的问题,请参考以下文章

laravel5.6 使用迁移创建表

laravel框架之数据迁移和数据填充

是否可以使用 Laravel 5 对动态数据库连接进行迁移?

laravel框架的数据迁移 (摘取)

基于表库动态创建sqlAlchemy Metaclass

Laravel/lumen 5.2 从现有数据库生成迁移表