如何将来自不同表的多种产品添加到一个购物车中

问题描述

我想从菜单,附加项目和交易这三个不同的表中将不同的物品添加到一个购物车中。

在给定的图片中,鸡肉汉堡来自菜单表,并从其他项目表获取番茄酱。

我能够从菜单表中添加多个项目及其价格,但是当我重新执行相同的代码以将其他项目表中的番茄酱之类的项目添加到购物车中时,它将鸡肉汉堡添加到购物车中而不是番茄酱中。

此外,当我创建另一个函数以将其他项目表中的番茄酱添加到相同的购物车中时,鸡肉汉堡已经添加了代码,将模型混合在一起,并且仅将一个项目添加到购物车中,这取决于序列。

希望大家理解我的问题,所以请指导我如何从三个不同的表中将多个项目添加到一个购物车中。

enter image description here

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;
       }

解决方法

这就是我的想法,menuadditional_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

我不知道您如何从视图中打印购物车,但是显然,您需要解决一些问题,但这并不难。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...