#laravel #cart
Вопрос:
Я работаю над созданием системы корзины в laravel, где при выборе пункта в меню он будет добавлен в качестве элемента корзины. Если товар уже существует в корзине, он должен просто увеличить количество. У меня это почти полностью работает, за исключением того, что решение, которое я разработал, позволяет в случае необходимости увеличить количество, оно также воссоздаст товар корзины, чтобы он был как с увеличенным количеством, так и без него. Я вложил много умственной энергии в борьбу с этим и надеялся, что кто-нибудь сможет помочь. Вот соответствующий код в контроллере для создания товара в корзине.
$cartItems = Cartitem::all();
if($cartItems->isEmpty()){
$cartItem = new Cartitem([
'name' => $request->name,
'image_url' => $request->image_url,
'description' => $request->description,
'price' => $request->price,
'quantity' => 1
]);
$cartItem->save();
} else {
forEach($cartItems as $item){
if($request->name != $item->name){
$cartItem = new Cartitem([
'name' => $request->name,
'image_url' => $request->image_url,
'description' => $request->description,
'price' => $request->price,
'quantity' => 1
]);
$cartItem->save();
} else {
$item->quantity;
$item->save();
}
}
}
Комментарии:
1. Вы заранее определяете названия карт. если, например, первый элемент не совпадает с тем, который вы хотите добавить, вы создаете новый элемент. Вместо foreach вы можете выполнить поиск в коллекции cartItems (если это коллекция, вы можете использовать
$cartItem = $cartItems->where('name',$request->name )->first()
, а затем использоватьif($cartItem)
)2. Ах да, это решило проблему. Я действительно ценю это!
Ответ №1:
$oldItem = Cartitem::where('name', $request->name)->first();
if ($oldItem) {
$oldItem->increment('quantity');
}
else {
$newItem = new Cartitem([
'name' => $request->name,
'image_url' => $request->image_url,
'description' => $request->description,
'price' => $request->price,
'quantity' => 1
]);
$newItem->save();
}
Комментарии:
1. Как это предотвратит создание нового элемента в foreach?
2. @GertB. ответ обновлен.
3. лучше 🙂
increment()
илиэто выбор, и оба, на мой взгляд, правильны.