UpdateOrCreate 不适用于数组字段

UpdateOrCreate not working with array fields

我在使用 UpdateOrCreate 和 Array 时遇到问题,这是我的控制器,我的 extra_id 是数组字段

 $cart =  Cart::updateOrCreate([
                            'user_id'=> $user_id,
                            'product_id'=>$id,
                            'attribute_id'=>$request->attribute_id,
                            'extra_id' => $request->extra_id,
                            ],
                            ['qty'=>DB::raw('qty + 1')]
                        );
   }

这里我使用 Casts 将字符串转换为数组,因为我已经在我的模型中完成了这个,

protected $casts = [
    'extra_id'=>'array'
];

如果 extra_id = [1,2] 出现问题,如果出现相同的数据,它会创建新记录而不是更新数量。

updateOrCreate 方法不支持使用分配给属性的数组进行查询。它不会为 json 字段执行 whereIn 或特别是 whereJsonContains。它将始终获取数组的第一个元素并分配给 where 条件。

因此,在您的情况下,生成的查询也会始终将数组的第一个元素分配给 extra_id 列。

我建议手动检查对象是否存在,然后单独处理更新和创建。

$cart = Cart::where(['user_id'=> $user_id,
                        'product_id'=>$id,
                        'attribute_id'=>$request->attribute_id,
                    ])
              ->whereJsonContains('extra_id', $request->extra_id)
              ->first();

if( $cart ) //will be empty if no result
   $cart->update([
                  'qty' => DB::raw('qty + 1') 
                 ]);

else
  $cart = Cart::create(['user_id'=> $user_id,
                        'product_id'=>$id,
                        'attribute_id'=>$request->attribute_id,
                        'extra_id' => $request->extra_id,
                        'qty' => 1
                       ]);