You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel PHP实现:将最近3个商品加入对比并从会话获取展示

Laravel商品对比页面:从Session获取最近3个商品的代码优化

需求:在Laravel PHP项目的商品对比页面中,从Session获取最近添加的3个商品用于展示,以下是原始实现代码:

class CompareController extends Controller 
{     
    public function index(Request $request)
    {
        if (App::isLocale('en')) {
            $language_id =  1;
        }else{
            $language_id =  4;
        }
       
        $data =   $request->products_id;
        $arr = Session::get('success');
        if( in_array( $data, $arr , TRUE )){
            return  $arr ;
        }else{
            Session::push('success',$data);
        }
    
        if(count($arr) > 3){
            array_shift($arr);
         }
         $product = DB::table('products')
                ->leftJoin('products_description','products_description.products_id','=','products.products_id')
                ->leftJoin('products_description','products_description.products_id','=','products.products_id')
                ->where('products_description.language_id','=', $language_id)
                ->whereIn('products.products_id',  $arr   )
                ->get();
    
        return view("website.layout.compare",compact('product'));
    }
    public function addToCompare(Request $request){
        
    }
   
}

代码存在的问题

  1. 语言ID判断逻辑冗余,可简化
  2. Session键名success语义模糊,换成compared_products更直观
  3. $arr = Session::get('success')可能返回null,直接用in_array会报错,需先初始化空数组
  4. 检查到商品已存在时直接return $arr,会中断视图渲染,应该跳过添加逻辑继续执行
  5. 修改$arr数组后未同步更新Session,导致Session内容无变化
  6. DB查询重复关联products_description表,属于无效操作
  7. 处理商品数量超过3个的逻辑顺序错误,应该在添加商品之后执行,否则新添加后总数会超过限制

修正后的代码

class CompareController extends Controller 
{     
    public function index(Request $request)
    {
        // 简化语言ID判断
        $language_id = App::isLocale('en') ? 1 : 4;

        $productId = $request->products_id;
        // 初始化Session数组,避免null报错
        $comparedProducts = Session::get('compared_products', []);

        if ($productId) {
            // 商品不在列表中才添加
            if (!in_array($productId, $comparedProducts, true)) {
                $comparedProducts[] = $productId;
                // 保持最多3个商品,超过则移除最早添加的
                if (count($comparedProducts) > 3) {
                    array_shift($comparedProducts);
                }
                // 更新Session
                Session::put('compared_products', $comparedProducts);
            }
        }

        // 查询商品数据,只关联一次描述表
        $products = DB::table('products')
            ->leftJoin('products_description', 'products_description.products_id', '=', 'products.products_id')
            ->where('products_description.language_id', '=', $language_id)
            ->whereIn('products.products_id', $comparedProducts)
            ->get();

        return view("website.layout.compare", compact('products'));
    }

    public function addToCompare(Request $request)
    {
        // 把添加逻辑独立出来,让index专注于页面渲染
        $productId = $request->products_id;
        $comparedProducts = Session::get('compared_products', []);

        if ($productId && !in_array($productId, $comparedProducts, true)) {
            $comparedProducts[] = $productId;
            if (count($comparedProducts) > 3) {
                array_shift($comparedProducts);
            }
            Session::put('compared_products', $comparedProducts);
        }

        // 重定向回对比页面
        return redirect()->route('compare.index');
    }
}

补充说明

  • 将添加商品的逻辑拆分到addToCompare方法,符合单一职责原则
  • 变量命名更清晰,比如$data改为$productId,$arr改为$comparedProducts,提升代码可读性
  • 所有操作先判断$productId是否存在,避免空值处理错误

内容的提问来源于stack exchange,提问作者Omar Selim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:30:42