您可以使用 foreignIdFor() 删除迁移中引用的模型吗?
Can you delete models referenced in migrations with foreignIdFor()?
我有一个旧的迁移,我使用 foreignIdFor()
方法创建了一个列。
我后来决定删除引用的模型,现在,当我在本地执行 migrate:refresh 时,迁移会触发一个错误,说明该模型当然不存在。
那么,是否应该永远不要删除使用 foreignIdFor()
引用的模型并改用 unsignedBigInteger()
?
编辑:
我知道 foreignIdFor
和 unsignedBigInteger
将创建相同的列。当我说我删除模型时,我指的是模型 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()
没有任何区别。
资源:
- https://laravel.com/docs/9.x/migrations#column-method-foreignIdFor
- https://laravel.com/docs/9.x/migrations#column-method-unsignedBigInteger
你could/needed要做的是添加级联删除,并确保每当删除关联模型时,所有相关模型也会被删除。
你可以这样做:
table->foreignId('column_name_id')
->constrained()
->onDelete('cascade');
资源:
编辑答案:
如果删除 foreignIdFor
中使用的模型,该方法将无法理解您引用的内容,因此会失败。所以,你的问题的答案是 YES 和 NO。
让我详细说明。例如,如果您的迁移只 运行 一次,在生产环境中,那么您将能够删除您在之前的迁移中引用的模型,并创建一个新的迁移来清理这些列.
在所有其他情况下,当您的迁移将 运行 几次(在本地使用 migrate:fresh
时),您需要在代码库中包含其中引用的模型为了使其正常工作。
如果你想避免你现在遇到的这类问题,只需使用 unsignedBigInteger
并传递给它作为列名的字符串,你不必担心删除模型。但是,你仍然需要注意不要删除那里引用的列,因为你会得到另一个丢失列的错误。
我有一个旧的迁移,我使用 foreignIdFor()
方法创建了一个列。
我后来决定删除引用的模型,现在,当我在本地执行 migrate:refresh 时,迁移会触发一个错误,说明该模型当然不存在。
那么,是否应该永远不要删除使用 foreignIdFor()
引用的模型并改用 unsignedBigInteger()
?
编辑:
我知道 foreignIdFor
和 unsignedBigInteger
将创建相同的列。当我说我删除模型时,我指的是模型 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()
没有任何区别。
资源:
- https://laravel.com/docs/9.x/migrations#column-method-foreignIdFor
- https://laravel.com/docs/9.x/migrations#column-method-unsignedBigInteger
你could/needed要做的是添加级联删除,并确保每当删除关联模型时,所有相关模型也会被删除。
你可以这样做:
table->foreignId('column_name_id')
->constrained()
->onDelete('cascade');
资源:
编辑答案:
如果删除 foreignIdFor
中使用的模型,该方法将无法理解您引用的内容,因此会失败。所以,你的问题的答案是 YES 和 NO。
让我详细说明。例如,如果您的迁移只 运行 一次,在生产环境中,那么您将能够删除您在之前的迁移中引用的模型,并创建一个新的迁移来清理这些列.
在所有其他情况下,当您的迁移将 运行 几次(在本地使用 migrate:fresh
时),您需要在代码库中包含其中引用的模型为了使其正常工作。
如果你想避免你现在遇到的这类问题,只需使用 unsignedBigInteger
并传递给它作为列名的字符串,你不必担心删除模型。但是,你仍然需要注意不要删除那里引用的列,因为你会得到另一个丢失列的错误。