Как увеличить количество модели laravel без создания копии

#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() или это выбор, и оба, на мой взгляд, правильны.