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

Laravel中如何将分类Eloquent集合通过AJAX传递给控制器做搜索筛选

问题解决方法

前端代码修复

错误原因

  • 你直接将PHP的Eloquent Collection对象输出到JS脚本中,JS无法识别PHP对象结构,直接导致控制台报错
  • JS中读取对象属性使用.语法,你写的value->id是PHP的对象属性读取语法,在JS环境下无效

修复后代码

$(document).ready(function(){
    // 直接在后端提取分类ID为JSON数组输出到JS,无需额外循环处理
    const categoryIds = {{ $categories->pluck('id') }};
    fetch_customer_data();
    function fetch_customer_data(query = '')
    {
        $.ajax({
            url:"{{ route('search') }}",
            method:'GET',
            data: {query: query, category_ids: category_ids },
            dataType:'json',
            success: function(data) {
                if (data.success) {
                    $('#result').html(data.html);
                } else {
                    console.log(data.message);
                }
            }
        })
    }
    $(document).on('keyup', '#keyword', function($e){
        var query = $(this).val();
        fetch_customer_data(query);
        $e.preventDefault();
    });
});

控制器代码修复

错误原因

  • 当前SQL条件逻辑存在漏洞,whereIn之后直接跟where和orWhere,会导致orWhere的条件绕过分类限制,搜索结果还是会出现非指定分类的商品
  • 原代码中AJAX请求出错时用return back()返回重定向没有实际意义,AJAX请求需要返回JSON格式响应
  • 缺少参数校验,容易出现非法参数导致SQL报错

修复后代码

public function search(Request $request)
{
    try{
        if($request->ajax()) {
            // 增加参数校验
            $validated = $request->validate([
                'query' => 'required|string',
                'category_ids' => 'required|array',
                'category_ids.*' => 'integer'
            ]);
            $query = $validated['query'];
            if(empty($query)) {
                return response()->json([
                    'success' => false,
                    'message' => "Désolé, une erreur de serveur s'est produite (requête vide)"
                ], 400);
             }
            else {
                $products =DB::table('product_categories')
                            ->join('produits', 'product_categories.produit', '=', 'produits.id')
                            ->join('categories', 'product_categories.categorie', '=', 'categories.id')
                            ->select('produits.*')
                            // 固定分类和可见性条件,不会被orWhere绕过
                            ->whereIn('product_categories.categorie', $validated['category_ids'])
                            ->where('categories.visibilite', 1)
                            ->where('produits.visibilite', 1)
                            // 把两个模糊查询的or条件包到闭包中,避免逻辑混乱
                            ->where(function($sql) use ($query) {
                                $sql->where('nomProduit','LIKE','%'.$query.'%')
                                    ->orWhere('typeActivite','LIKE','%'.$query.'%');
                            })
                            ->get();

            }
            $total = $products->count();
            $html = view('front.search_result', [
                    'products' => $products,
                ])->render();


            return response()->json([
                'success' => true,
                'html' => $html,
                'total' => $total,
            ], 200);
        } else {
            return response()->json([
                'success' => false,
                'message' => "Oups! quelque chose s'est mal passé !",
            ], 403);
        }
    }catch (Exception $e) {
        Alert::error('Erreur ', $e->getMessage())->autoClose(false);
        return response()->json([
            'success' => false,
            'message' => $e->getMessage()
        ], 500);
    }catch (Error $e) {
        Alert::error('Erreur ', $e->getMessage())->autoClose(false);
        return response()->json([
            'success' => false,
            'message' => $e->getMessage()
        ], 500);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:00:01