我有许多带前缀的数据库。这些都具有相同的数据库结构。
例如:
这些都在不断增加。
我想通过前缀在所有数据库上运行迁移。我如何在Laravel中做到这一点?
答案 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');
}
}