3
votes

i'm making an online shopping project with laravel, But there is a problem here, I want if the user adds the product to the shopping cart and there is already the same product will be added quantity amount,

but on my project: if a user adds a product to the shopping cart and already has the same product, it will add a new value item to the session

like this : enter image description here

array :

array:3 [▼
  0 => array:5 [▼
    "id" => 7
    "nama_product" => "adssdsadxx"
    "harga" => 13
    "pict" => "s.gif"
    "qty" => 1
  ]
  1 => array:5 [▼
    "id" => 7
    "nama_product" => "adssdsadxx"
    "harga" => 13
    "pict" => "s.gif"
    "qty" => 1
  ]
  2 => array:5 [▼
    "id" => 7
    "nama_product" => "adssdsadxx"
    "harga" => 13
    "pict" => "s.gif"
    "qty" => 1
  ]
]

I want it like this (if the user adds the product to the shopping cart and there is already the same product will be added quantity amount): enter image description here

array :

array:1 [▼
  0 => array:5 [▼
    "id" => 7
    "nama_product" => "adssdsadxx"
    "harga" => 39
    "pict" => "s.gif"
    "qty" => "3"
  ]
]

this is my ProductsController.php :

   public function Cart()
    {
        return view('shop.cart');
    }

    public function addToCart(Request $request, $id)
    {
        $product = DB::select('select * from products where id='.$id);
        $cart = Session::get('cart');
        $cart[] = array(
            "id" => $product[0]->id,
            "nama_product" => $product[0]->nama_product,
            "harga" => $product[0]->harga,
            "pict" => $product[0]->pict,
            "qty" => 1,
        );

        Session::put('cart', $cart);
        Session::flash('success','barang berhasil ditambah ke keranjang!');
        //dd(Session::get('cart'));
        return redirect()->back();
    }

    public function updateCart(Request $cartdata)
    {
        $cart = Session::get('cart');

        $cartQty = 1;

        foreach ($cartdata->all() as $id => $val) 
        {
            if ($cartQty != 1) {
                $cart[$id]['qty'] = $val;
                if ($val < 1) {
                    unset($cart[$id]);
                }
            }
            $cartQty++;
        }
        Session::put('cart', $cart);
        return redirect()->back();
    }

    public function deleteCart($id)
    {
        $cart = Session::get('cart');
        unset($cart[$id]);
        Session::put('cart', $cart);
        return redirect()->back();
    }

Thank you very much...

2

2 Answers

6
votes

Update product quantity if product already exist, otherwise add new product into the cart.

Note: Make sure app/Http/Kernel.php should have StartSession into the protected $middleware like this.

enter image description here

 /**
     * Add product to the cart
     *
     * @return success message
     */
    public function addToCart(Request $request){
        $product = $request->all();

        $cart = Session::get('cart');

        /*
         * If product already exist into the cart then update QTY of product
         * Othewise add new product into the cart
         */
        if(isset($cart[$product['id']])):
            $cart[$product['id']]['qty'] += 1;
        else:
            $cart[$product['id']] = $product;
            $cart[$product['id']]['qty'] = 1; // Dynamically add initial qty
        endif;

        Session::put('cart', $cart);

        return Response::json(['success' => true, 'cart_items' => count(Session::get('cart')), 'message' => 'Cart updated.']);
    }
4
votes

you need to change a bit your code:

public function addToCart(Request $request, $id)
{
    $product = DB::select('select * from products where id='.$id);
    $cart = Session::get('cart');
    $cart[$product[0]->id] = array(
        "id" => $product[0]->id,
        "nama_product" => $product[0]->nama_product,
        "harga" => $product[0]->harga,
        "pict" => $product[0]->pict,
        "qty" => 1,
    );

    Session::put('cart', $cart);
    Session::flash('success','barang berhasil ditambah ke keranjang!');
    //dd(Session::get('cart'));
    return redirect()->back();
}

public function updateCart(Request $cartdata)
{
    $cart = Session::get('cart');

    foreach ($cartdata->all() as $id => $val) 
    {
        if ($val > 0) {
            $cart[$id]['qty'] += $val;
        } else {
            unset($cart[$id]);
        }
    }
    Session::put('cart', $cart);
    return redirect()->back();
}

just create cart array keyby-ing it by product ID.