Laravel問題:更新hasMany關係記錄的問題
P粉054616867
2023-08-30 21:47:17
<p>我有一個與品牌模型有 hasMany 關係的使用者模型,並且我在正確更新用戶的品牌時遇到問題。 </p>
<p>我有一個表單,允許用戶在文字欄位中輸入/刪除/更新自己的品牌,我目前使用的在用戶輸入或編輯品牌後更新用戶品牌的方法是刪除所有現有品牌與用戶關聯,然後循環值,創建品牌模型,然後“saveMany”...但是我在添加時似乎遇到了約束衝突...我想知道是否有更好的方法來做到這一點;< /p>
<p>我的<code>User</code>模型有以下內容;</p>
<pre class="brush:php;toolbar:false;">public function brands()
{
return $this->hasMany('Brands::class');
}
</pre>
<p>然後在我的控制器中,我有以下程式碼來更新品牌;</p>
<pre class="brush:php;toolbar:false;">$user->brands()->delete();
foreach ($request['brands'] as $brand) {
$brandArray[] = new Brand([
'name' => $brand['name'],
'rating' => $brand['rating'],
]);
}
!empty($brandArray) && $user->brands()->saveMany($brandArray);
</pre>
<p>有更好的方法嗎? </p>
讓我們將事情分成三個部分:
# 約束鍵違規:
如果您在另一個表上新增了外鍵約束,並且需要刪除品牌,則您也應該刪除所有受外鍵約束的相關資料。
# 設計
如果無法刪除品牌相關數據,那麼也許我們可以考慮是否有更好的設計。也許我們可以在前端添加一個鉤子,每當用戶刪除某些資料時調用 DELETE API。
# 查詢
如果品牌有一些唯一的密鑰,您可以使用
upsert
而不是 saveMany。這樣效率會更高。#結論
我建議每當用戶刪除品牌時,透過前端的鉤子刪除品牌,並使用
upsert
來處理建立和更新
內容