【发布时间】:2021-12-25 02:21:27
【问题描述】:
我有一个表participant,它与表campaign 有many-to-one 关系。现在由于一些愚蠢的原因,我忘记添加一个列campaign_id,它包含表campaign 中行的外键。现在要解决这个问题,我可以轻松地将以下行添加到 create_participants_table 迁移文件并运行 php artisan migrate:fresh 命令,这将删除所有表并使用正确的列重新创建它们。
$table->unsignedBigInteger('campaign_id');
但问题是这两个表都已经投入生产并且已经包含数据,因此运行migrate:fresh 并不是最佳选择。所以在这种情况下,我会创建另一个名为 add_campaign_id_to_participants 的迁移文件,如下所示:
public function up()
{
Schema::table('participants', function (Blueprint $table) {
$table->unsignedBigInteger('campaign_id');
});
}
问题是在运行php artisan migrate 时出现错误Cannot add a NOT NULL column with default value NULL。这似乎是公平的,因为该列不可为空并且没有默认值。但是使列可以为空或设置默认值似乎并不可取。
现在我的participants 表与visitors 表有one-to-one 关系,其中每个参与者都有一个访问者,但不是每个访问者都有一个参与者。同样visitors 表与campaign 表有many-to-one 关系。这意味着理论上我可以为参与者填写刚刚创建的campaign_id,如下所示:
$participant->visitor->campaign->id
现在我的问题是这是否可行,如果可以,我将如何实现?
【问题讨论】:
-
尝试`$table->unsignedBigInteger('campaign_id')->nullable();` 或`$table->unsignedBigInteger('campaign_id')->default(0);`。 laravel.com/docs/8.x/migrations#column-modifiers
-
我认为你没有理解@OlehTytarenko 的问题。
标签: php laravel database laravel-artisan migrate