我有2張桌子。(1) 是使用者,以及 (2) 是食物。
在 [users] 表中,有一個 food_id 括號作為外鍵鏈接到另一個表 [foods] 中的專案/列的 id。
我可以預訂 [food] 列,但我希望能夠在預訂后按專案上的“確認”按鈕,這將洗掉該專案在資料庫中的目標列。
雖然由于兩個表都與外鍵鏈接,但我知道我需要將父鍵設定為 null 以便能夠完全洗掉目標列。否則它會給我一個錯誤,我無法洗掉/更新帶有子物件的父項。
(我的食物物件主 ID 鏈接到經過身份驗證的用戶的 food_id 外鍵。)
我嘗試的當前代碼只會引發以下錯誤:“呼叫成員函式 onDelete() on null”
$foodsId = User::find(auth()->user()->foods_id);
$foodsId->onDelete('set null');
$foodsId->save();
$foodDel = Foods::find($id);
$foodDel->delete();
不知道在這里想什么。
uj5u.com熱心網友回復:
您可以編輯外鍵約束以自動執行此操作,但是您可以使用這些行來完成您要執行的操作。
$food = Food::findOrFail(auth()->user()->food_id);
auth()->user()->fill(['food_id' => null])->save(); // use forceFill() if food_id is not in the User's fillable fields.
$food->delete();
要自動發生這種情況,您可以使用以下命令進行遷移
php artisan make:migration changeFoodIdForeignKeyConstraint --table=users
function up()
{
Schema::table('users', function (Blueprint $table) {
$table->dropForeign(['food_id']);
$table->foreign('food_id')
->references('id')->on('foods')
->onUpdate('cascade')
->onDelete('set null');
});
}
另一種方法是在使用模型事件Food模型
class Food extends Model
{
/**
* The "booted" method of the model.
*
* @return void
*/
protected static function booted()
{
static::deleting(function ($food) {
User::where('food_id', $food->id)->update(['food_id' => null]);
});
}
uj5u.com熱心網友回復:
實際上已經找到了我自己的解決方案。我直接定位我的第一個外鍵,然后為其分配一個空引數,然后獲取我的專案的目標 ID 并洗掉其列。
$user = auth()->user();
$user->food_id = null;
$foodDel = Foods::find($id);
$foodDel->delete();
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/312816.html
標籤:php 拉拉维尔 phpmyadmin
上一篇:Laravel和Vue:如何從Vue組件的公共檔案夾中獲取影像?
下一篇:使用Session計算觀看次數
