我有一個舊遷移,我使用該foreignIdFor()方法創建列。
后來我決定洗掉參考的模型,現在,當我在本地執行 migrate:refresh 時,遷移會觸發一個錯誤,指出模型不存在,當然。
那么,是否應該永遠不要洗掉參考的模型foreignIdFor()并unsignedBigInteger()改為使用?
編輯:
我知道foreignIdFor并將unsignedBigInteger創建相同的列。當我說我洗掉了模型時,我的意思是模型類,而不是模型。
我的遷移檔案:
<?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');
}
}
uj5u.com熱心網友回復:
該foreignIdFor方法{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
您可以/需要做的是添加級聯洗掉,并確保每當洗掉關聯模型時,也會洗掉所有相關模型。
你可以這樣做:
table->foreignId('column_name_id')
->constrained()
->onDelete('cascade');
資源:
- https://laravel.com/docs/9.x/migrations#foreign-key-constraints
回復編輯:
如果您洗掉 中使用的模型foreignIdFor,該方法將無法理解您所參考的內容,因此它將失敗。因此,您的問題的答案是“是”和“否”。
讓我詳細說明。例如,如果您的遷移僅在生產環境中運行一次,那么您將能夠洗掉您在之前的遷移中參考的模型,并創建一個新的遷移來清理這些列。
在所有其他情況下,當您的遷移將運行幾次(當您使用時在本地運行migrate:fresh)時,您需要在代碼庫中包含其中參考的 Model 才能正常作業。
如果您想避免您現在遇到的這類問題,只需使用unsignedBigInteger并將列名的字串傳遞給它,您不必擔心洗掉模型。但是,您仍然需要注意不要洗掉那里參考的列,因為您將收到另一個缺少列的錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/451572.html
