如何在 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 中的多个数据库上运行迁移?的主要内容,如果未能解决你的问题,请参考以下文章