如何在 Laravel 中的多个数据库上运行迁移?

Posted

技术标签:

【中文标题】如何在 Laravel 中的多个数据库上运行迁移?【英文标题】:How do I run migration on multiple databases in Laravel? 【发布时间】:2017-05-25 13:54:25 【问题描述】:

我有许多带有前缀的数据库。这些都具有相同的数据库结构。

例如:

database_foo database_bar database_xyz

而且这些还在不断增加。

我想通过前缀在所有数据库上运行迁移。我如何在 Laravel 中做到这一点?

【问题讨论】:

【参考方案1】:

我已经找到了我认为的解决方案。 您可以根据需要在config\database.php 中创建数据库连接。 之后,您可以像这样编写迁移:

Schema::connection('mysql2')->create('some_table', function($table)

    $table->increments('id'):
);

【讨论】:

我的数据库在动态增加。它不是静态数据库。如果我有静态数据库,我可以使用这个命令运行; php artisan 迁移 --database=myconnection1【参考方案2】:

就我而言,我有一个主数据库,用于存储所有其他数据库(子数据库)的所有信息连接。

要在每个子数据库上运行迁移,我将代码放在下面。

请注意:我在 Laravel 中创建了 2 个连接。我在运行时动态更改的默认一个和第二个取决于执行请求的客户端。我认为在数据库中为每个客户端手动创建连接效率不高:我可能有 100 个客户端,所以猜猜那里的代码会怎样!而且,这样一来,您还需要为每个客户创建特定的模型。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

use App\Models\Enseigne;

class CreateUserTable extends Migration

    private $Enseigne;
    private $dbClients;

    public function __construct()
    
        //Here i'm loading my model and i'm geting all list of child connection from my main database
        $this->Enseigne = new Enseigne();
        $this->dbClients = $this->Enseigne->getAll();
    

    private function switchDb($infosDb) 
    
        config(['database.connections.client.host'      => $infosDb->dbhost]);
        config(['database.connections.client.port'      => $infosDb->dbport]);
        config(['database.connections.client.database'  => $infosDb->dbname]);
        config(['database.connections.client.username'  => $infosDb->dbuser]);
        config(['database.connections.client.password'  => $infosDb->dbpass]);
    

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        // Looping through mylist of connection
        foreach ($this->dbClients as $infosDb) 
            // Switching my connexion on my client connexion here
            $this->switchDb($infosDb);

            Schema::connection('client')->create('users', function (Blueprint $table) 
                $table->id();
                $table->timestamps();
            );

            // Note that purge, it's very important to clean the connection cache
            // Otherwise you'll migrate on the same DB even if you iterate it
            DB::purge('client');
        
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::connection('client')->dropIfExists('users');
    

【讨论】:

以上是关于如何在 Laravel 中的多个数据库上运行迁移?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 中运行特定迁移 [重复]

Laravel 5.0 - 在 1 个迁移中重命名多个列

将迁移放在 Laravel 5.1 包中的啥位置?

Laravel artisan 迁移多个数据库

如何在 LARAVEL_7 中通过迁移发送多个复选框

如何在 Laravel 迁移中使用多个数据库设置外键约束