#php #mysql #laravel #e-commerce #cart
#php #mysql #laravel #электронная коммерция #Корзина
Вопрос:
здесь у меня возникла проблема с использованием update_orcreate с массивом, это мой контроллер, здесь мой 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')]
);
}
здесь я использовал приведения для преобразования строки в массив, для этого я сделал это в своей модели,
protected $casts = [
'extra_id'=>'array'
];
и что касается проблемы, если extra_id = [1,2] и снова, если появляются те же данные, создается новая запись вместо обновления количества.
Комментарии:
1. приведение также ожидает, что переданный атрибут будет массивом с ключами, возможно, повторно проверьте, является ли $request-> extra_id массивом, также в базе данных дополнительный идентификатор является объектом JSON
2. $request-> extra_id — это массив, и я сохранил extra_id в формате json в базе данных
Ответ №1:
updateOrCreate
метод не поддерживает выполнение запросов с использованием массива, присвоенного атрибуту. Он не будет выполнять whereIn
или, особенно, whereJsonContains
для полей json. Он всегда будет принимать первый элемент массива и присваивать 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
]);
Комментарии:
1. в моем случае у меня есть старая база данных, которую я пробовал с тем же случаем, но мои ключи json с читаемыми ключами, такими как [«value1″=> 0, «value2» => 0], каким-то образом это сработало xD
2. Сначала пропущено обращение к json, обновлено для обслуживания полей json.
3. большое вам спасибо, вы сэкономили много моего времени, я собирался реализовать некоторую длинную логику спасибо, я никогда раньше не пользовался WherIn