问题描述
我想从菜单,附加项目和交易这三个不同的表中将不同的物品添加到一个购物车中。
在给定的图片中,鸡肉汉堡来自菜单表,并从其他项目表获取番茄酱。
我能够从菜单表中添加多个项目及其价格,但是当我重新执行相同的代码以将其他项目表中的番茄酱之类的项目添加到购物车中时,它将鸡肉汉堡添加到购物车中而不是番茄酱中。
此外,当我创建另一个函数以将其他项目表中的番茄酱添加到相同的购物车中时,鸡肉汉堡已经添加了代码,将模型混合在一起,并且仅将一个项目添加到购物车中,这取决于序列。
希望大家理解我的问题,所以请指导我如何从三个不同的表中将多个项目添加到一个购物车中。
public function getAddToCart( Request $request,$id ) {
$product = Menu::find( $id );
$oldCart = Session::has( 'cart' ) ? Session::get( 'cart' ) : null;
$cart = new Cart( $oldCart );
$cart->add( $product,$product->id );
$request->session()->put( 'cart',$cart );
// dd($request->session()->get('cart'));
return redirect()->route( 'pages.menu',$id );
}
上面的代码用于将菜单表中的项目(如鸡肉汉堡)添加到购物车中,beow代码用于将其他项目表中的项目添加至购物车中的番茄酱
public function getAddToNewCart( Request $request,$id ) {
$product = AdditionalItems::find( $id );
//dd($product);
$oldCart = Session::has( 'cart' ) ? Session::get( 'cart' ) : null;
$cart = new Cart( $oldCart );
$cart->add( $product,$product->id );
$request->session()->put( 'cart',$cart );
dd( $request->session()->get( 'cart' ) );
return redirect()->route( 'pages.menu',$id );
}
它是购物车模型中的添加功能
public function add($item,$id){
$storedItem = ['qty'=>0,'price'=>$item->price,'item'=> $item];
if($this->items){
if(array_key_exists($id,$this->items)){
$storedItem = $this->items[$id];
}
}
$storedItem['qty'] ++;
$storedItem['price'] = $item->price * $storedItem['qty'];
$this->items[$id] = $storedItem;
$this->totalQty ++;
$this->totalPrice += $item->price;
}
解决方法
这就是我的想法,menu
和additional_items
表的ID不能一起工作。
例如,如果您的menu
表如下所示:
+----+-----------+
| ID | Item |
+----+-----------+
| 1 | Hamburger |
+----+-----------+
您的additional_item
如下:
+----+-----------+
| ID | Item |
+----+-----------+
| 1 | Ketchup |
| 2 | Fanta |
+----+-----------+
当您将汉堡包添加为$card->add($product,$product->id)
时,一切都会很好,因为只有一个项目的ID
等于1。
但是一旦您将Ketchup与$card->add($product,$product->id)
添加在一起,由于Ketchup在ID
中将additional_items
设置为1,并且由于这种情况,
if(array_key_exists($id,$this->items)){
$storedItem = $this->items[$id];
}
您的代码就像:“好吧,我已经知道此项目,因此我只会增加qty
”,因为您在additional_items
的ID 1和{{1的ID 1之间没有区别}},这就是为什么您对添加的项目有这种不正确的奇怪行为的原因。显然,如果将Hamburger(将menu
设置为1)和Fanta(将ID
设置为2),则该问题将不会出现,因为没有ID覆盖。
要解决您的问题,您有几种解决方案:
首先,您可以在每个表中使用一个UUID,以便可以在表之间共享唯一的ID,但这并不是很普遍,老实说,这以后可能会导致其他问题。
第二,这个解决方案对我来说更好,是将模型属性ID
分为2类(每张表一个类)。
$items
现在您可以像这样调用方法public function add($item,$category){
$storedItem = ['qty'=>0,'price'=>$item->price,'item'=> $item];
if($this->items){
// To avoid undefined error
if (!array_key_exists($category,$this->items))
$this->items[$category] = [];
if(array_key_exists($item->id,$this->items[$category])){
$storedItem = $this->items[$category][$item->id];
}
}
$storedItem['qty'] ++;
$storedItem['price'] = $item->price * $storedItem['qty'];
$this->items[$category][$item->id] = $storedItem;
$this->totalQty ++;
$this->totalPrice += $item->price;
}
:
add
我不知道您如何从视图中打印购物车,但是显然,您需要解决一些问题,但这并不难。