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
]);
我在使用 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
]);