您可以使用 foreignIdFor() 删除迁移中引用的模型吗?

Can you delete models referenced in migrations with foreignIdFor()?

我有一个旧的迁移,我使用 foreignIdFor() 方法创建了一个列。

我后来决定删除引用的模型,现在,当我在本地执行 migrate:refresh 时,迁移会触发一个错误,说明该模型当然不存在。

那么,是否应该永远不要删除使用 foreignIdFor() 引用的模型并改用 unsignedBigInteger()

编辑:

我知道 foreignIdForunsignedBigInteger 将创建相同的列。当我说我删除模型时,我指的是模型 class,而不是 a 模型。

我的迁移文件:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use App\Models\Event;
use App\Models\OutlookCategory;

class CreateEventOutlookCategoryTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('event_outlook_category', function (Blueprint $table) {
            $table->id();
            $table->foreignIdFor(Event::class);
            $table->foreignIdFor(OutlookCategory::class);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('event_outlook_category');
    }
}

foreignIdFor 方法为给定模型 class 添加了一个 {column}_id UNSIGNED BIGINT 等效列,因此使用 unsignedBigInteger() 没有任何区别。

资源:

你could/needed要做的是添加级联删除,并确保每当删除关联模型时,所有相关模型也会被删除。

你可以这样做:

table->foreignId('column_name_id')
      ->constrained()
      ->onDelete('cascade');

资源:

编辑答案:

如果删除 foreignIdFor 中使用的模型,该方法将无法理解您引用的内容,因此会失败。所以,你的问题的答案是 YES 和 NO。

让我详细说明。例如,如果您的迁移只 运行 一次,在生产环境中,那么您将能够删除您在之前的迁移中引用的模型,并创建一个新的迁移来清理这些列.

在所有其他情况下,当您的迁移将 运行 几次(在本地使用 migrate:fresh 时),您需要在代码库中包含其中引用的模型为了使其正常工作。

如果你想避免你现在遇到的这类问题,只需使用 unsignedBigInteger 并传递给它作为列名的字符串,你不必担心删除模型。但是,你仍然需要注意不要删除那里引用的列,因为你会得到另一个丢失列的错误。