Laravel-Problem: Problem beim Aktualisieren von hasMany-Beziehungsdatensätzen
P粉054616867
2023-08-30 21:47:17
<p>Ich habe ein Benutzermodell, das eine hasMany-Beziehung mit einem Markenmodell hat, und ich habe Probleme, die Marke des Benutzers korrekt zu aktualisieren. </p>
<p>Ich habe ein Formular, mit dem Benutzer ihre eigene Marke in ein Textfeld eingeben/entfernen/aktualisieren können. Die Methode, die ich derzeit verwende, um die Marke eines Benutzers zu aktualisieren, nachdem der Benutzer die Marke eingegeben oder bearbeitet hat, besteht darin, alle vorhandenen Marken zu löschen mit dem Benutzer, dann die Werte durchlaufen, das Markenmodell erstellen, dann „saveMany“ ... aber ich scheine beim Hinzufügen einen Einschränkungskonflikt zu bekommen ... Ich frage mich, ob es einen besseren Weg gibt, dies zu tun < /p>
<p>Mein <code>Benutzer</code>-Modell hat Folgendes;</p>
<pre class="brush:php;toolbar:false;">public function brands()
{
return $this->hasMany('Brands::class');
}
</pre>
<p>Dann habe ich in meinem Controller den folgenden Code, um die Marke zu aktualisieren;</p>
<pre class="brush:php;toolbar:false;">$user->brands()->delete();
foreach ($request['brands'] as $brand) {
$brandArray[] = neue Marke([
'name' => $brand['name'],
'rating' => $brand['rating'],
]);
}
!empty($brandArray) && $user->brands()->saveMany($brandArray);
</pre>
<p>Gibt es einen besseren Weg? </p>
让我们将事情分成三个部分:
# 约束键违规:
如果您在另一个表上添加了外键约束,并且需要删除品牌,则还应该删除所有受外键约束的相关数据。
# 设计
如果无法删除品牌相关数据,那么也许我们可以考虑是否有更好的设计。也许我们可以在前端添加一个钩子,每当用户删除某些数据时调用 DELETE API。
# 查询
如果品牌有一些唯一的密钥,您可以使用
upsert
而不是 saveMany。这样效率会更高。#结论
我建议每当用户删除品牌时,通过前端的钩子删除品牌,并使用
upsert
来处理创建和更新
内容