我想使用同步方法透過資料透視ID 更新訂單產品,因為在我的場景中訂單可以有多個具有相同ID 的產品,並且我想更新我調用其資料透視ID 的產品並刪除其他我未更新的產品,但你從同步語法知道它接受產品的id。
範例
這就是將產品附加到訂單時我的正文和資料透視表的樣子
{ "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 | 顏色 | 數量 |
---|---|---|---|---|
1 | 1 | 1 | 紅色 | 2 |
2 | 1 | 1 | 黑色 | 10 |
3 | 1 | 2 | 黑色 | 1 |
更新訂單產品時
{ "products": [ { "id" : 1, "product_id" :1 , "color": "blue", "quantity": 12 }, { "id" : 3, "product_id" :2, "color": "blue", "quantity": 5 } ]}
我希望我的桌子是什麼樣子
id | order_id | 產品ID | 顏色 | 數量 |
---|---|---|---|---|
1 | 1 | 1 | 藍色 | 12 |
3 | 1 | 2 | 藍色 | 5 |
但是得到了這個預期的錯誤
"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))"
訂單控制器
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, ]); }
訂單產品移轉
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(); });
有什麼想法可以解決我的問題嗎?
您需要在不屬於多個關係的情況下處理此問題,並且必須建立一個中間或樞軸模型。
並且需要更改訂單和產品型號(如果不用則產品型號可選)
在你的控制器更新方法中
// 假設你的請求結構是
您需要建立自己的同步方法
我希望這對您有幫助,並且您可能需要使用事務來防止錯誤,並且添加相應的驗證