我希望能够在 Laravel 10 中运行迁移无数次而不会删除旧表,
详细来说,我有一个主数据库,其中包含用户、公司等常用表,并且该数据库有一个名为数据库的特殊表,每次我需要一个新数据库时,我都会向该表添加一条记录,其中包含(主机,端口、用户名、密码...),我更新
config/database.php
连接数组并添加此连接。
这个新数据库将代表连接到某个公司的表,例如发票表。新数据库很可能被称为 company1 如果我需要将公司 2 添加到我的应用程序中,我将添加一个名为 company2 的新数据库并在那里添加发票表!
为了能够将表添加到新数据库,我需要多次运行迁移而不删除旧数据库中的表,因为需要数据!!
代码是:
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
$databases = DatabaseHelper::all();
foreach($databases as $database) {
$connection = Schema::connection($database->name);
if (!$connection->hasTable('tests')) {
$connection->create('tests', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
}
}
要多次运行迁移而不删除旧数据库中的表,您可以创建一个自定义 Artisan 命令,该命令允许您动态指定数据库连接,然后运行迁移。以下是实现这一目标的方法:
创建自定义 Artisan 命令:
使用以下命令生成自定义 Artisan 命令:
php artisan make:command RunMigration
这将在
app/Console/Commands
目录中创建一个新的命令文件。
修改自定义命令:
打开生成的
RunMigration.php
文件并修改它以接受数据库连接名称作为参数。您可以通过添加 protected $signature
属性和 handle
方法来完成此操作。这是一个例子:
// app/Console/Commands/RunMigration.php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
class RunMigration extends Command
{
protected $signature = 'run:migration {connection}';
protected $description = 'Run a migration on a specific database connection';
public function handle()
{
$connectionName = $this->argument('connection');
$databases = DatabaseHelper::all();
foreach ($databases as $database) {
if ($database->name === $connectionName) {
$this->runMigration($database->name);
return;
}
}
$this->error('Database connection not found.');
}
private function runMigration($connectionName)
{
$connection = Schema::connection($connectionName);
if (!$connection->hasTable('tests')) {
$connection->create('tests', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
$this->info('Migration ran successfully.');
} else {
$this->info('Table already exists. Skipping migration.');
}
}
}
在此示例中,
RunMigration
命令采用{connection}
参数,该参数应与您要使用的数据库连接的名称匹配。然后,它检查该连接中是否存在表“tests”,如果不存在则运行迁移。
运行自定义命令:
您现在可以像这样运行自定义 Artisan 命令:
php artisan run:migration company1
将“company1”替换为您要使用的数据库连接的名称。该命令将对指定数据库运行迁移,而不影响其他数据库。
通过创建此自定义 Artisan 命令,您可以控制要迁移的数据库连接,从而允许您将表添加到新数据库而不影响现有数据库。