Laravel - 如何更改Session数组中键的值

时间:2016-05-23 23:34:20

标签: php laravel session

所以我正在构建一个购物车,我正在使用Session为访客用户存储数据。这是我存储项目的方式。

Session::push('cartItems', [
    'product' = > $product,
    'size' = > $request['size'],
    'quantity' = > $request['quantity']
]);

如果访客用户添加了相同大小的项目,则只应将所选数量添加到cartItem['quantity']。我是这样做的:

foreach(Session::get('cartItems') as $cartItem) {
    if ($cartItem['product'] - > id == $product_id) {
        $isNewItem = false;
        if ($cartItem['size'] == $request['size']) {
            $cartItem['quantity'] += (int) $request['quantity'];
        } else {
            Session::push('cartItems', [
                'product' = > $product,
                'size' = > $request['size'],
                'quantity' = > $request['quantity']
            ]);
        }
    }
}

当我尝试在购物车中已经存在相同尺寸的产品时添加产品时,它会通过代码的那一部分

if ($cartItem['size'] == $request['size']) {
    $cartItem['quantity'] += (int) $request['quantity'];
}

$cartItem的数量根本没有变化。我怎样才能改变它?

2 个答案:

答案 0 :(得分:2)

在你的循环中,$ cartItem是一个临时循环变量 - 改变它不会影响会话值。或者换句话说,当尺寸相等时,您不会更新会话。

Laravel有一个方便的方法push()用于推送到数组 - 你已经使用它了,但不幸的是没有数组"更新"方法,所以你需要获取整个购物车,根据需要更新它,然后再次设置:

objMyConn.ConnectionString =  "Provider=sqloledb; Data Source=" & range("B2").value & "; Initial Catalog=" & range("B3").value &"; Integrated Security=SSPI;"

答案 1 :(得分:0)

我通过以下方式找到了解决方案:

$cartItems = Session::get('cartItems', []);
foreach ($cartItems as &$cartItem) {
    if ($cartItem['product']->id == $product_id) {
        $isNewItem = false;
        if ($cartItem['size'] == $request['size']) {
             $cartItem['quantity'] += (int)$request['quantity'];
             $cartItem->save();
             Session::set('cartItems', $cartItems);
        } else {
            Session::push('cartItems', [
                'product' => $product,
                'size' => $request['size'],
                'quantity' => $request['quantity']
             ]);
        }
    }
}

我通过做一些挖掘找到了这个解决方案。这是question