Laravel检查会话数组中是否存在项目

时间:2018-08-27 16:58:58

标签: php laravel

我正在制作laravel购物车,现在正在使用laravel会话。
我的想象是:

  1. 如果购物车会话为空
    添加第一个产品
  2. 如果不是
    检查请求产品的ID(如果不是现有产品的ID):
     ->推送到购物车会话数组
    如果不是
     ->不要推送到购物车会话数组

我可以将产品推送到会话中,但是对于第一个产品,当我再添加一次相同的产品时,就添加了该产品,但是第二,第三...产品可以正常工作。
我尝试了很多时间,但没有找到解决方法。你能帮我吗?
这是我的带有添加方法的CartController *

public function add(Request $request)
{
  $cartItems = session('cart');
  $productInfoToCart = array(
    "id" => request('id'),
    "name" => request('name'),
    "code" => request('code'),
    "price" => request('price')
  );
  if ($cartItems !== null){
    if (array_search(request('id'), array_column($cartItems, 'id'))) {
      return redirect ('/cart')->with('status', 'Product exists, you can change quantity before payment');
    } else {
    $request->session()->push('cart', $productInfoToCart);
    $request->session()->flash('status', 'Product added to cart');

    return redirect('/cart');
    }
  } else {
    $request->session()->push('cart', $productInfoToCart);
    $request->session()->flash('status', 'First Product added to cart');

    return redirect('/cart');
  }
}

2 个答案:

答案 0 :(得分:0)

您应该创建一个Cart类,并且不对控制器中的cart逻辑进行编码。您正在将数据存储在会话中,但将来可能会将其存储在其他位置,并且此代码将不再起作用,因此请尽量不要将逻辑与存储系统耦合。

您还可以轻松地简化代码(在其中使用返回语句时,没有多余的“ if else”)

public function add()
{
    $cartItems = session('cart');
    $productInfoToCart = array(
      "id" => request('id'),
      "name" => request('name'),
      "code" => request('code'),
      "price" => request('price')
    );
    if ($cartItems !== null){
        if (isset($cartItems[request('id')]){
            return redirect ('/cart'); //...
        }
        $cartItems[request('id')] = $productInfoToCart;
        $request->session()->put('cart', $cartItems);
        $request->session()->flash('status', 'Product added to cart');   
        return redirect('/cart');
    }
    $cartItems[request('id')] = $productInfoToCart;
    $request->session()->put('cart', $cartItems);
    $request->session()->flash('status', 'First Product added to cart');
    return redirect('/cart');
}

答案 1 :(得分:0)

最后,我找到了解决方法,只需编辑此行:

if (array_search(request('id'), array_column($cartItems, 'id')))  

收件人:

if (array_search(request('id'), array_column($cartItems, 'id')) !== false)  

因为也许旧行将返回搜索键,而不是逻辑结果,所以我无法运行下一个逻辑命令。