Problème Laravel : problème de mise à jour de nombreux enregistrements de relation
P粉054616867
2023-08-30 21:47:17
<p>J'ai un modèle User qui a une relation hasMany avec un modèle Brand et j'ai du mal à mettre à jour correctement la marque de l'utilisateur. </p>
<p>J'ai un formulaire qui permet aux utilisateurs de saisir/supprimer/mettre à jour leur propre marque dans un champ de texte. La méthode que j'utilise actuellement pour mettre à jour la marque d'un utilisateur après que l'utilisateur a saisi ou modifié la marque consiste à supprimer toutes les marques existantes associées. avec l'utilisateur, puis parcourez les valeurs, créez le modèle de marque, puis "saveMany"... mais il me semble avoir un conflit de contraintes lors de l'ajout... Je me demande s'il existe une meilleure façon de procéder < /p>
<p>Mon modèle <code>Utilisateur</code>
<pre class="brush:php;toolbar:false;">marques de fonctions publiques()
{
return $this->hasMany('Brands::class');
}
≪/pré>
<p>Ensuite, dans mon contrôleur, j'ai le code suivant pour mettre à jour la marque ;</p>
<pre class="brush:php;toolbar:false;">$user->brands()->delete();
foreach ($request['brands'] as $brand) {
$brandArray[] = nouvelle marque([
'nom' => $marque['nom'],
'note' => $marque['note'],
]);
}
!empty($brandArray) && $user->brands()->saveMany($brandArray);
≪/pré>
<p>Existe-t-il une meilleure solution ? </p>
Divisons les choses en trois parties :
# Violation de la clé de contrainte :
Si vous avez ajouté une contrainte de clé étrangère sur une autre table et que vous devez supprimer la marque, vous devez également supprimer toutes les données associées contraintes par la clé étrangère.
#Conception
Si les données relatives à la marque ne peuvent pas être supprimées, nous pouvons peut-être envisager s'il existe un meilleur design. Peut-être pourrions-nous ajouter un hook sur le frontend qui appelle l'API DELETE chaque fois que l'utilisateur supprime des données.
# Requête
Si la marque possède des clés uniques, vous pouvez utiliser
upsert
au lieu de saveMany. Ce sera plus efficace.#conclusion
Je recommande de supprimer la marque via un hook sur le frontend chaque fois que l'utilisateur la supprime, et d'utiliser
upsert
来处理创建和更新
pour gérer lacréation et la mise à jour
du contenu