Saya ingin mengemas kini produk pesanan mengikut ID pangsi menggunakan kaedah penyegerakan kerana dalam senario saya, pesanan boleh mempunyai berbilang produk dengan ID yang sama dan saya ingin mengemas kini produk yang ID pangsinya saya panggil dan memadamkan produk lain yang belum saya kemas kini produk, tetapi anda tahu daripada sintaks penyegerakan bahawa ia menerima id produk.
Contoh
Beginilah rupa badan dan meja pangsi saya apabila melampirkan produk pada pesanan
{ "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 Produk | Warna | Kuantiti |
---|---|---|---|---|
1 | 1 | 1 | Merah | 2 |
2 | 1 | 1 | Hitam | 10 |
3 | 1 | 2 | Hitam | 1 |
Semasa mengemaskini produk pesanan
{ "products": [ { "id" : 1, "product_id" :1 , "color": "blue", "quantity": 12 }, { "id" : 3, "product_id" :2, "color": "blue", "quantity": 5 } ]}
Saya mahu rupa meja saya
id | order_id | ID Produk | Warna | Kuantiti |
---|---|---|---|---|
1 | 1 | 1 | Biru | 12 |
3 | 1 | 2 | Biru | 5 |
Tetapi mendapat ralat yang dijangkakan ini
"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))"
Pengawal Pesanan
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, ]); }
Tempahan migrasi produk
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(); });
Ada idea bagaimana untuk menyelesaikan masalah saya?
Anda perlu mengendalikan perkara ini tanpa mempunyai pelbagai perhubungan dan perlu mencipta model perantaraan atau pangsi.
Dan anda perlu menukar pesanan dan model produk (jika tidak digunakan, model produk adalah pilihan)
Dalam kaedah kemas kini pengawal anda
// Anggap struktur permintaan anda ialah
Anda perlu mencipta kaedah penyegerakan anda sendiri
Saya harap ini membantu anda dan anda mungkin mahu menggunakan transaksi untuk mengelakkan ralat dan menambah pengesahan dengan sewajarnya