Laravel の問題: hasMany 関係レコードの更新の問題
P粉054616867
2023-08-30 21:47:17
<p>ブランド モデルと hasMany 関係を持つユーザー モデルがあり、ユーザーのブランドを正しく更新できません。 </p>
<p>ユーザーがテキストフィールドに自分のブランドを入力/削除/更新できるフォームがあります。ユーザーがブランドを入力または編集した後にユーザーのブランドを更新するために現在使用している方法は、関連付けられている既存のブランドをすべて削除することです。 user を使用して、値をループし、ブランド モデルを作成して、「saveMany」を実行します...しかし、追加するときに制約の競合が発生するようです...これを行うより良い方法があるかどうか疑問に思っています。 /p>
<p>私の <code>User</code> モデルには次のようなものがあります;</p>
<pre class="brush:php;toolbar:false;">パブリック関数brand()
{
return $this->hasMany('Brands::class');
}
</pre>
<p>次に、コントローラーにブランドを更新する次のコードがあります;</p>
<pre class="brush:php;toolbar:false;">$user->brands()->delete();
foreach ($request['brands'] as $brand) {
$brandArray[] = 新しいブランド([
'名前' => $brand['名前']、
'評価' => $brand['評価'],
]);
}
!empty($brandArray) && $user->brands()->saveMany($brandArray);
</pre>
<p>もっと良い方法はありますか? </p>
物事を 3 つの部分に分けてみましょう:
# 制約キー違反:
別のテーブルに外部キー制約を追加し、ブランドを削除する必要がある場合は、外部キーによって制約されている関連データもすべて削除する必要があります。
#### デザイン###ブランド関連データを削除できない場合は、より良いデザインがないか検討できるかもしれません。ユーザーがデータを削除するたびに DELETE API を呼び出すフックをフロントエンドに追加できるかもしれません。
#お問い合わせ
ブランドにいくつかの一意のキーがある場合は、saveMany の代わりに
upsertを使用できます。これはより効率的になります。
upsert####結論は###
ユーザーがブランドを削除するたびにフロントエンドのフックを介してブランドを削除し、を使用して
コンテンツの作成と更新を処理することをお勧めします。