Segerakkan oleh ID Jadual Pangsi dan bukannya ID Model
P粉121447292
P粉121447292 2024-02-17 15:02:30
0
1
468

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粉121447292
P粉121447292

membalas semua(1)
P粉207483087

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

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan