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
相关产品推荐
相关产品推荐

