我正在使用laravel框架创建一个极简主义的电子商务Web应用程序,我是一个新手。
我想要实现的是当会话中存在产品时,我想在单击Add to Cart
按钮时更新该产品的数量。如果会话中不存在,我想将其插入会话中。
到目前为止我尝试过的代码:
public function store( $id ) {
$product = Product::findOrFail( $id );
if ( \Session::has( 'cart' ) && is_array( \Session::get('cart') ) ) {
\Session::push('cart', ['product' => (int)$id, 'quantity' => 1 ]);
} else {
\Session::put('cart', ['product' => (int)$id, 'quantity' => 1 ]);
}
\Session::flash('added_product', 'Product Added in the cart');
return \Redirect::back();
}
上述代码的结果是:
array:3 [▼
0 => array:2 [▼
"product" => 1
"quantity" => 1
]
1 => array:2 [▼
"product" => 2
"quantity" => 1
]
2 => array:2 [▼
"product" => 1
"quantity" => 1
]
]
期望的结果是:
array:2 [▼
0 => array:2 [▼
"product" => 1
"quantity" => 2
]
1 => array:2 [▼
"product" => 2
"quantity" => 1
]
]
请帮助我解决这个问题。感谢。
更新1 :
在Youssef回答之后,我得到了以下结果:
array:4 [▼
"product" => 1
"quantity" => 1
0 => array:2 [▼
"product" => 3
"quantity" => 1
]
1 => array:2 [▼
"product" => 2
"quantity" => 1
]
]
答案 0 :(得分:2)
我不知道Laravel,但我认为你可以像这样处理数组:
public function store( $id ) {
$product = Product::findOrFail( $id );
if ( \Session::has( 'cart' ) && is_array( \Session::get('cart') ) ) {
$cart = \Session::get('cart');
$found = false;
foreach($cart as $i=>$el)
{
if($el['product'] == $id)
{
$cart[$i]['quantity']++;
$found = true;
}
}
if(!$found) {
$cart[] = ['product' => $i, 'quantity' => 1];
}
\Session::put('cart', $cart);
} else {
\Session::put('cart', [['product' => (int)$id, 'quantity' => 1 ]]);
}
\Session::flash('added_product', 'Product Added in the cart');
return \Redirect::back();
}
答案 1 :(得分:0)
如果您正在创建的会话中存在该条目,并将另一个项目推送到该数组,从而导致重复的结果。您应该将if块更改为以下内容:
$value = Session::pull( 'cart', ['product' => int($id), 'quantity' => 0 ]);
$value['quantity'] += 1;
Session::put('cart', $value);
pull
方法调用将获取购物车价值(如果存在)或创建新价格(如果它不存在(数量为0))。它会增加数量,这意味着如果它已经存在则会增加1,或者如果它是您在pull
调用中创建的那个则设置为1。当您致电pull
时,会从会话中删除该值,以便您通过调用put
将新值重新放入会话中。希望这能提供更简洁的代码。
您可以将数组安全检查添加到增量语句中:array_key_exists('quantity')