Maison  >  Questions et réponses  >  le corps du texte

Problème Laravel : problème de mise à jour de nombreux enregistrements de relation

<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>
P粉054616867P粉054616867437 Il y a quelques jours522

répondre à tous(1)je répondrai

  • P粉702946921

    P粉7029469212023-08-31 11:27:59

    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 la création et la mise à jour du contenu

    répondre
    0
  • Annulerrépondre