【问题标题】:Add column to all tables through migration in Laravel通过 Laravel 中的迁移向所有表添加列
【发布时间】:2021-09-11 15:00:48
【问题描述】:

随着项目规模的扩大,我们决定每一个数据都应该属于创建它们的公司。因此,我要添加一列“data_owner_company_id”,指向拥有给定记录的公司。是的,可以生成迁移以将此列添加到每个模型,但这并不可行,因为有 120 多个表和模型。我怎样才能以最小的努力解决这个问题?

对于模型部分,我认为我可以通过继承轻松地将其应用于所有模型,但不确定迁移。

TL;DR 如何通过迁移将 int 列添加到所有表中?

数据库:MySQL v8 框架:Laravel 8、PHP 7.3

【问题讨论】:

  • 我想你必须手动完成

标签: database laravel migration database-migration


【解决方案1】:

如果您在数据库中找到所有表的名称,这很简单,您必须循环并为每个表创建列。

尝试使用队列创建列,因为对于 120 个表来说这将是一项繁重的工作。

检查以下代码:

class CreateDataOwnerCompanyIdtoEachTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up ()
    {
        $columns = 'Tables_in_' . env('DB_DATABASE');//This is just to read the object by its key, DB_DATABASE is database name.
        $tables = DB::select('SHOW TABLES');

        foreach ( $tables as $table ) {
            //todo add it to laravel jobs, process it will queue as it will take time.
            Schema::table($table->$columns, function (Blueprint $table) {
                $table->unsignedInteger('data_owner_company_id');
            });
        }
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down ()
    {
        $columns = 'Tables_in_' . env('DB_DATABASE');//This is just to read the object by its key, DB_DATABASE is database name.
        $tables = DB::select('SHOW TABLES');

        foreach ( $tables as $table ) {
            //todo add it to laravel jobs, process it will queue as it will take time.
            Schema::table($table->$columns, function (Blueprint $table) {
                $table->dropColumn('data_owner_company_id');
            });
        }
    }
}

【讨论】:

  • 它似乎可以解决问题。我会尝试实现它。但我不明白一件事,我们需要表格列做什么?表名(数组)对于架构来说还不够吗?
  • 这实际上是一个错字,那不是一个表列,它是单个表名。
【解决方案2】:

我不能 100% 确定它会起作用,但它就是这样:

创建扩展 Illuminate\Database\Schema\Blueprint; 的类

在构造函数中调用父构造函数然后

$this->unsignedBigInteger('data_owner_company_id')->nullable();

在迁移中使用你的新类而不是默认的Blueprint

【讨论】:

  • 有趣的方法。以这种方式处理它而不是通过程序化迁移有什么缺点吗?
猜你喜欢
  • 2021-11-11
  • 2021-05-13
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 2011-06-17
  • 2021-01-29
  • 2014-12-26
相关资源
最近更新 更多