繁体   English   中英

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

[英]How do I run migration on multiple databases in Laravel?

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

例如:

  • 数据库_foo
  • 数据库栏
  • 数据库_xyz

而且这些还在不断增加。

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

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

Schema::connection('mysql2')->create('some_table', function($table)
{
    $table->increments('id'):
});

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

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

请注意:我在 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');
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM