0

0

Laravel 中限制用户在购物车会话中添加来自不同店铺的商品

聖光之護

聖光之護

发布时间:2025-10-19 11:52:12

|

601人浏览过

|

来源于php中文网

原创

laravel 中限制用户在购物车会话中添加来自不同店铺的商品

本文旨在解决 Laravel 应用中,如何限制用户在购物车会话中添加来自不同店铺(`sponsor_id`)的商品。我们将探讨两种实现方案:一种是在添加商品时检查购物车中已存在的商品是否来自同一店铺;另一种是将商品按店铺 ID 分组存储在不同的购物车中。通过本文,你将学会如何根据业务需求选择合适的方案,并提供相应的代码示例。

电商平台开发中,经常会遇到需要限制用户购物车行为的场景。例如,某些平台可能要求用户在完成当前店铺的订单之前,不能添加其他店铺的商品到购物车。本文将针对这一需求,提供两种在 Laravel 中实现该功能的方案,并详细讲解代码实现。

方案一:添加商品时检查店铺 ID

这种方案的核心思想是在用户尝试添加新的商品到购物车时,首先检查购物车中是否已经存在商品,如果存在,则检查新商品的 sponsor_id 是否与购物车中已存在商品的 sponsor_id 相同。如果不同,则阻止添加,并给出相应的提示。

public function addToCart(Request $request, $id)
{
    $cart = session("cart");
    $produk = Produk::detail_produk($id);

    if (isset($cart[$id])) {
        $cart[$id]["qty"]++;
        session()->put('cart', $cart);
    } else {
        $num = count($cart);
        if($num > 0){
          $this_sponsor_id = $produk->sponsor_id;
          foreach($cart as $produk_id => $produk_data){
            if($produk_data['sponsor_id'] != $this_sponsor_id){
              return redirect()->back()->with('error', '购物车中已存在其他店铺的商品,请先完成订单!');
            }
          }
        }
        $cart[$id] = [
            "sponsor_id" => $produk->sponsor_id,
            "nama_produk" => $produk->nama_produk,
            "harga_produk" => $produk->harga_produk,
            "berat" => $produk->berat,
            "gambar" => $produk->gambar,
            "qty" => $request->qty
        ];
    }
    session(["cart" => $cart]);
    return redirect()->back()->with('success', '产品已成功添加到购物车!');
}

代码解释:

  1. 首先,从 Session 中获取购物车数据 ($cart)。
  2. 获取要添加到购物车的商品信息 ($produk)。
  3. 如果购物车中已经存在该商品,则增加数量。
  4. 如果购物车中不存在该商品,则进行店铺 ID 检查:
    • 如果购物车为空,则直接添加商品。
    • 如果购物车不为空,则获取新商品的 sponsor_id,并遍历购物车中的商品,逐个比较 sponsor_id。
    • 如果发现购物车中存在与新商品 sponsor_id 不同的商品,则返回错误信息,阻止添加。
  5. 如果通过了店铺 ID 检查,则将新商品添加到购物车。
  6. 更新 Session 中的购物车数据。
  7. 返回成功提示。

注意事项:

ShoopD 网上商店系统
ShoopD 网上商店系统

用 php + mysql 驱动的在线商城系统,我们的目标为中国的中小企业及个人提供最简洁,最安全,最高效的在线商城解决方案,使用了自建的会员积分折扣功能,不同的会员组有不同的折扣,让您的商店吸引更多的后续客户。 系统自动加分处理功能,自动处理会员等级,免去人工处理的工作量,让您的商店运作起来更方便省事 采用了自建的直接模板技术,免去了模板解析时间,提高了代码利用效率 独立开发的购物车系统,使用最

下载
  • 在实际应用中,需要根据你的 Produk 模型和数据库结构调整代码。
  • 错误提示信息可以根据你的需求进行自定义。
  • 建议在前端也进行相应的校验,以提高用户体验。

方案二:按店铺 ID 分组存储购物车

这种方案将购物车按照店铺 ID 分组存储,每个店铺对应一个独立的购物车。这样,用户可以同时添加多个店铺的商品到购物车,但是每个店铺的商品是相互独立的。

public function addToCart(Request $request, $id)
{
    $newcart  = session("newcart");
    $produk = Produk::detail_produk($id);
    // 确保店铺 ID 对应的购物车存在
    if(!isset($newcart[$produk->sponsor_id])){
      $newcart[$produk->sponsor_id] = [];
    }
    if(isset($newcart[$produk->sponsor_id][$id])){
      $newcart[$produk->sponsor_id][$id]["qty"]++;
      session()->put('newcart', $newcart);
    } else {
      $newcart[$produk->sponsor_id][$id] = [
          "sponsor_id" => $produk->sponsor_id,
          "nama_produk" => $produk->nama_produk,
          "harga_produk" => $harga_produk,
          "berat" => $produk->berat,
          "gambar" => $produk->gambar,
          "qty" => $request->qty
      ];
    }
    session(["newcart" => $newcart]);
    return redirect()->back()->with('success', '产品已成功添加到购物车!');
}

代码解释:

  1. 首先,从 Session 中获取购物车数据 ($newcart)。
  2. 获取要添加到购物车的商品信息 ($produk)。
  3. 检查 $newcart 中是否存在以 $produk->sponsor_id 为键的子数组。如果不存在,则创建一个新的空数组。
  4. 如果该店铺的购物车中已经存在该商品,则增加数量。
  5. 如果该店铺的购物车中不存在该商品,则将新商品添加到该店铺的购物车。
  6. 更新 Session 中的购物车数据。
  7. 返回成功提示。

注意事项:

  • 在结算时,需要分别处理每个店铺的购物车,计算总价和运费等。
  • 前端需要展示多个购物车,方便用户管理不同店铺的商品。
  • 这种方案更适合允许用户同时购买多个店铺商品,但需要分别结算的场景。

总结

本文介绍了两种在 Laravel 中限制用户在购物车会话中添加来自不同店铺的商品的方法。第一种方法通过在添加商品时检查店铺 ID,可以强制用户在完成当前店铺的订单之前,不能添加其他店铺的商品。第二种方法通过按店铺 ID 分组存储购物车,允许用户同时添加多个店铺的商品,但需要分别结算。开发者可以根据自己的业务需求选择合适的方案。在实际应用中,还需要根据具体的模型和数据库结构进行调整,并添加相应的错误处理和用户提示。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

319

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

276

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

370

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

371

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

81

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

64

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.08.05

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

314

2023.10.17

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号