问题描述
这是我在使用UpdateOrCreate和Array时遇到的问题,这是我的控制器,这里的extra_id是数组字段
// log4js.json
{
"appenders": {
"cloudWatch": {
"type": "console","layout": {
"type": "basic"
}
}
},"categories": {
"default": {
"appenders": [
"cloudWatch"
],"level": "debug"
}
}
}
在这里,我已经使用Casts将字符串转换为数组,因为我已经在模型中做到了这一点,
$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')]
);
}
如果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,'extra_id' => $request->extra_id,'qty' => 1
]);