如何与 Laravel syncWithoutDetaching 中的 2 个主要项目同步

How to sync with 2 main items in Laravel syncWithoutDetaching

Cart_product table 有 4 列:

id | cart_id | product_id | size_id | quantity

belongsToManyCartProductSize 的关系。

用户可以添加不同尺寸但不同尺寸的产品,因此 product->id = 1 可以有 size->id = 1 和 size->id = 2。

我想同步 product->id 和 size->id 其中只有 1 行相同的 product->id 和 size->id。

使用此代码,只有我的产品->id 同步。

        $this->cart->products()->syncWithoutDetaching(
[$product->id => ['size_id' => $size->id, 'quantity' => $quantity]]
            );

正如我所说,我需要同步产品->id 和尺寸->id,我可以拥有不同尺寸的产品:

id | cart_id | product_id | size_id | quantity
1  | 1       |1           | 2       |2
2  | 1       |1           | 3       |1

但不是相同尺寸的产品:

id | cart_id | product_id | size_id | quantity
1  | 1       |1           | 2       |2
2  | 1       |1           | 2       |1

我检查了很多案例:

        $this->cart->products()->syncWithoutDetaching(
[$product->id, $size->id => ['quantity' => $quantity]]
            );

但是取不到真正的结果!

BelongsToMany 关系是为 pivot tables 建立的,只有两个外键作为它们的唯一性索引。在您的情况下,唯一性是通过三个索引 cart_idproduct_idsize_id 获得的,因此您不能使用关系中的任何预定义方法来实现您的目标。

旁注:我建议您在数据库中添加此约束,以便在您的代码尝试在这些索引中插入具有相同值的两行时触发错误

要与三个索引同步,我建议您使用 updateOrInsert()upsert()

\DB::table('your_pivot_table_name')->updateOrInsert(
    ['cart_id' => 1, 'product_id' => 1, 'size_id' => 2], //the unique index to look out for
    ['quantity' => 2] //the other fields to sync
);

另一个想法是将枢轴 table 声明为 Custom Intermediate Table Models 并使用 updateOrCreate() 将方法添加到“同步”。

编辑:更新

DB::table('cart_product')->upsert(
    [
        [ 'cart_id' => $this->instance()->id, 'product_id' => $product->id, 'size_id' => $size->id, 'quantity' => (int) $qunatity]
    ], 
    ['cart_id', 'product_id', 'size_id'], 
    ['quantity']
);