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

时间:2017-01-10 22:33:22

标签: php mysql database laravel migration

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

例如:

  • database_foo
  • database_bar
  • database_xyz

这些都在不断增加。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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