重新运行 Laravel 迁移

问题描述 投票:0回答:1

我希望能够在 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 命令!!

laravel database-migration laravel-artisan artisan-migrate
1个回答
0
投票

要多次运行迁移而不删除旧数据库中的表,您可以创建一个自定义 Artisan 命令,该命令允许您动态指定数据库连接,然后运行迁移。以下是实现这一目标的方法:

  1. 创建自定义 Artisan 命令:

    使用以下命令生成自定义 Artisan 命令:

    php artisan make:command RunMigration
    

    这将在

    app/Console/Commands
    目录中创建一个新的命令文件。

  2. 修改自定义命令:

    打开生成的

    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”,如果不存在则运行迁移。

  3. 运行自定义命令:

    您现在可以像这样运行自定义 Artisan 命令:

    php artisan run:migration company1
    

    将“company1”替换为您要使用的数据库连接的名称。该命令将对指定数据库运行迁移,而不影响其他数据库。

通过创建此自定义 Artisan 命令,您可以控制要迁移的数据库连接,从而允许您将表添加到新数据库而不影响现有数据库。

© www.soinside.com 2019 - 2024. All rights reserved.