Ich möchte Bestellprodukte anhand der Pivot-ID mithilfe der Synchronisierungsmethode aktualisieren, da in meinem Szenario eine Bestellung mehrere Produkte mit derselben ID enthalten kann und ich das Produkt, dessen Pivot-ID ich aufrufe, aktualisieren und die anderen löschen möchte, die ich nicht aktualisiert habe Produkt, aber Sie wissen aus der Synchronisierungssyntax, dass es die ID des Produkts akzeptiert.
Beispiel
So sehen mein Körper und meine Pivot-Tabelle aus, wenn ich Produkte an eine Bestellung anhänge
{ "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 | Produkt-ID | Farbe | Menge |
---|---|---|---|---|
1 | 1 | 1 | Rot | 2 |
2 | 1 | 1 | Schwarz | 10 |
3 | 1 | 2 | Schwarz | 1 |
Beim Aktualisieren von Bestellprodukten
{ "products": [ { "id" : 1, "product_id" :1 , "color": "blue", "quantity": 12 }, { "id" : 3, "product_id" :2, "color": "blue", "quantity": 5 } ]}
Wie mein Tisch aussehen soll
id | order_id | Produkt-ID | Farbe | Menge |
---|---|---|---|---|
1 | 1 | 1 | Blau | 12 |
3 | 1 | 2 | Blau | 5 |
Aber dieser erwartete Fehler ist aufgetreten
"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))"
Auftragskontrolleur
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, ]); }
Produktmigration bestellen
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(); });
Irgendwelche Ideen, wie ich mein Problem lösen kann?
您需要在不属于多个关系的情况下处理此问题,并且必须创建一个中间或枢轴模型。
并且需要更改订单和产品型号(如果不用则产品型号可选)
在你的控制器更新方法中
// 假设你的请求结构是
您需要创建自己的同步方法
我希望这对您有帮助,并且您可能需要使用事务来防止错误,并且添加相应的验证