【问题标题】:How to add multiple products into one cart from different tables如何将不同表格中的多个产品添加到一个购物车中
【发布时间】:2020-08-17 18:03:05
【问题描述】:

我想从三个不同的表格(如菜单、附加物品和交易)中将不同的物品添加到一个购物车中。

在给定的图片中,Chicken burger 来自菜单表并从 Additionalitems 表中获取番茄酱。

我可以添加多个项目,它是菜单表中的价格,但是当我重新使用相同的代码将附加项目表中的番茄酱等项目添加到购物车中时,它会将鸡肉汉堡而不是番茄酱添加到购物车中。

此外,当我创建另一个函数将番茄酱从附加项目表添加到同一个购物车中时,鸡肉汉堡已经添加了代码混合模型并且只将一个项目添加到购物车中,这取决于顺序。

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

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

上面的代码用于将菜单表中的项目(如鸡肉汉堡)添加到购物车中,而下面的代码用于将附加项目表中的项目添加到购物车中,如番茄酱

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

【问题讨论】:

  • 你能展示你的方法$cart->add吗?因为我怀疑购物车中每件商品的 ID 存在问题。为什么 ?因为您正在从具有自己的 ID 处理的表格菜单中检索一条记录,并且对于表格 AdditionalItem 也是如此,这意味着在您的情况下,您购物车中的某些产品可以具有相同的 ID 而实际上不是相同的产品,这将解释您遇到的未定义行为,因为在某些情况下,您有两个 ID 为 1 和 2 的产品,但在另一种情况下,您有两个 ID 为 1 的产品。
  • @bjovanov 我添加了用于从菜单表中添加项目的添加功能。请检查一下

标签: php laravel e-commerce cart


【解决方案1】:

我就是这么想的,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 在 additional_items 中将 ID 设置为 1,并且由于这种情况,

if(array_key_exists($id, $this->items)){
    $storedItem = $this->items[$id];
}

您的代码类似于:“好吧,我已经知道这个项目,所以我将增加 qty”,因为您在 additional_items 的 ID 1 和 menu 的 ID 1 之间没有任何区别,这就是为什么你有这种不正确的添加项目的奇怪行为。显然,如果你添加 Hamburger(ID 为 1)和 Fanta(ID 为 2),则不会出现问题,因为没有 ID 覆盖。

要解决您的问题,您有多种解决方案:

首先,您可以在每个表中使用一个 UUID,这样您就可以在您的表之间共享一个唯一 ID,但这并不常见,老实说,这可能会导致以后出现其他问题。

其次,这个解决方案对我来说看起来更好,是将您的模型属性 $items 分为 2 个类别(每个表一个类别)。

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

$cart->add($product, 'menu');
$card->add($product, 'additional_item');

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

【讨论】:

  • 我添加了它不起作用,但是它从会话中的一个表中一次添加一个项目意味着当我从菜单表中添加值时,当我清除会话时它只添加菜单表项,然后我从它添加的 Additional_items 表中添加项目,但同时当我从菜单中添加项目时,它显示错误菜单未定义
  • 对不起,我不明白你现在有什么问题,你能详细说明一下吗?对于未定义的错误,这只是因为我没有尝试此代码,但您的属性 item 应该默认初始化您的类别,或者您可以在您的 add 方法中动态地进行初始化。我编辑了我的帖子以更正它。
  • 它在添加if (!array_key_exists($category, $this->items)) $this->items[$category] = []; 后工作,但现在它不会从menuadditional_items 表中添加多个项目,它会从menuadditional_item 表中添加一项.实际上,当使用 dd 函数知道 getAddToCart 函数中的结果时,我在添加代码后得到了静态 ID,我不知道它来自哪里 +items: array:1 [▼"menu" => array:1 [▼**2** => array:4 [▼"qty" => 1 "price" => 12.0 "id" => 2 "item" => App\Menu {#312 ▶}]] ]+totalQty: 1+totalPrice: 12.0 主要问题是 2 是静态的跨度>
  • 对不起,由于空间较小,我添加了新评论 2 的主要问题是写在星星之间,这是静态的,我认为这就是我无法添加多个项目的原因。 +items: array:1 [▼"menu" => array:1 [▼****2**** => array:4...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 2017-11-19
相关资源
最近更新 更多