Rumah  >  Soal Jawab  >  teks badan

Segerakkan oleh ID Jadual Pangsi dan bukannya ID Model

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粉121447292P粉121447292219 hari yang lalu398

membalas semua(1)saya akan balas

  • P粉207483087

    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

    balas
    0
  • Batalbalas