Rumah > Soal Jawab > teks badan
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?
P粉2074830872024-02-18 12:10:04
Anda perlu mengendalikan perkara ini tanpa mempunyai pelbagai perhubungan dan perlu mencipta model perantaraan atau pangsi.
class OrderProduct extends Model { // optional belongs to order and product method protected $fillable = [ 'product_id', 'order_id', 'color', 'quantity' ]; }
Dan anda perlu menukar pesanan dan model produk (jika tidak digunakan, model produk adalah pilihan)
class Order extends Model { public function order_products() { return $this->hasMany(OrderProduct::class); } }
Dalam kaedah kemas kini pengawal anda
// Anggap struktur permintaan anda ialah
[ 'id' => 1, // Order id, 'order_attribute_1', // Any of your order model attribute 'order_attribute_2', // Any of your order model attributes 'products' => [ [ 'id' => null, // id of the order_product table so, null cause is a new added product 'order_id' => 1, // id of order 'product_id' => 1// id of product 'color' => 'blue', 'quantity' => 12 ], [ 'id' => 1, // id of the order_product table so, has id cause are you updating an existent product in the order 'order_id' => 1, // id of order 'product_id' => 1// id of product 'color' => 'blue', 'quantity' => 5 ] ] ]
Anda perlu mencipta kaedah penyegerakan anda sendiri
public function update(AdminUpdateOrderRequest $request, $id) { $orderValidated = $request->validated(); $order = Order::findOrFail($id); $order->update($orderValidated); // start simulation of sync method $new_order_products = []; // id of order_product to preserve $order_products_to_keep = []; // I hope you have the corresponding products validation on your request class foreach ($request['products'] as $request_product) { // need to create new product in order if (empty($request_product['id'])) { $new_order_products[] = [ 'product_id' => $request_product['product_id'], 'order_id' => $request_product['order_id'], 'color' => $request_product['color'], 'quantity' => $request_product['quantity'] ] } else { // find the order_order product register $order_product = OrderProduct::find(request_product['id']); // update all except the order id $order_product->update([ 'product_id' => $request_product['product_id'], 'color' => $request_product['color'], 'quantity' => $request_product['quantity'] ]); // as exists this order_product will be preserved $order_products_to_keep[] = $order_product->id; } } // calculate the order_products to delete (if not present means that needs to be deleted) foreach ($order->order_products as $order_product) { if (!in_array($order_products_to_keep, $order_product->id)) { $order_product->delete(); } } // mass insertion of new order_products $order->order_products()->createMany($new_order_products); DB::table return OrderResource::make($order)->additional([ 'success' => true, ]); }
Saya harap ini membantu anda dan anda mungkin mahu menggunakan transaksi untuk mengelakkan ralat dan menambah pengesahan dengan sewajarnya