Je souhaite mettre à jour les produits de la commande par ID pivot en utilisant la méthode de synchronisation car dans mon scénario, une commande peut avoir plusieurs produits avec le même ID et je souhaite mettre à jour le produit dont j'appelle l'ID pivot et supprimer les autres que je n'ai pas mis à jour. produit, mais vous savez grâce à la syntaxe de synchronisation qu'il accepte l'identifiant du produit.
Exemple
Voici à quoi ressemblent mon corps et mon tableau croisé dynamique lorsque je joins des produits à une commande
{ "products": [ { "product_id": 1, "color": "red", "quantity": 2 }, { "product_id": 1, "color": "black", "quantity": 10 }, { "product_id": 2, "color": "black", "quantity": 1 } ] }
id | order_id | ID produit | Couleur | Quantité |
---|---|---|---|---|
1 | 1 | 1 | Rouge | 2 |
2 | 1 | 1 | Noir | 10 |
3 | 1 | 2 | Noir | 1 |
Lors de la mise à jour des produits commandés
{ "products": [ { "id" : 1, "product_id" :1 , "color": "blue", "quantity": 12 }, { "id" : 3, "product_id" :2, "color": "blue", "quantity": 5 } ]}
À quoi je veux que ma table ressemble
id | order_id | ID produit | Couleur | Quantité |
---|---|---|---|---|
1 | 1 | 1 | Bleu | 12 |
3 | 1 | 2 | Bleu | 5 |
Mais j'ai eu cette erreur attendue
"message": "SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY' (SQL: insert into `order_product` (`color`, `created_at`, `id`, `order_id`, `product_id`, `quantity`, `size`, `updated_at`) values (blue, 2022-07-04 21:38:25, 7, 3, 1, 12, S, 2022-07-04 21:38:25))"
Contrôleur de commandes
public function update(AdminUpdateOrderRequest $request, $id) { $orderValidated = $request->validated(); $order = Order::findOrFail($id); $order->update($orderValidated); if (isset($orderValidated['products'])) { $order->products()->sync($orderValidated['products']); } DB::table return OrderResource::make($order)->additional([ 'success' => true, ]); }
Commander la migration du produit
Schema::create('order_product', function (Blueprint $table) { $table->id(); $table->foreignId('order_id')->nullable()->constrained('orders')->onUpdate('cascade'); $table->foreignId('product_id')->nullable()->constrained('products')->onUpdate('cascade'); $table->integer('quantity')->nullable(); $table->string('color')->nullable(); $table->timestamps(); });
Des idées pour résoudre mon problème ?
Vous devez gérer cela sans appartenir à plusieurs relations et créer un modèle intermédiaire ou pivot.
Et vous devez modifier la commande et le modèle de produit (s'il n'est pas utilisé, le modèle de produit est facultatif)
Dans la méthode de mise à jour de votre contrôleur
// Supposons que la structure de votre demande est
Vous devez créer votre propre méthode de synchronisation
J'espère que cela vous aidera et vous souhaiterez peut-être utiliser des transactions pour éviter les erreurs et ajouter une validation en conséquence