Laravel中如何搜索JSON字段?JSON查询失效问题求助
看起来你踩了JSON字段搜索的常见坑——普通的LIKE查询只会把JSON当成普通字符串处理,根本不会解析里面的键值对,所以搜不到藏在company_name里的"hitech"。我来给你几个解决办法,顺便帮你理清楚原来的查询逻辑问题:
解决JSON字段搜索的问题
首先,你的核心问题是company_name是JSON格式字段,普通LIKE无法识别其结构。针对Laravel,有两种常用方案:
1. 精确匹配JSON中的值(用Laravel原生方法)
如果你的需求是精确匹配"hitech"这种完整值,Laravel的whereJsonContains方法非常好用,它会自动解析JSON字段并匹配指定路径的值:
// 先整理搜索参数 $companyNameSearch = $request->input('company_name'); $matchThese = [ 'country' => $request->input('country'), 'main_category' => $request->input('main-category'), ]; $companies = Company::where(function($query) use ($companyNameSearch) { // 匹配JSON中en或ar字段等于搜索词的记录 $query->whereJsonContains('company_name->en', $companyNameSearch) ->orWhereJsonContains('company_name->ar', $companyNameSearch); }) // 应用其他固定匹配条件 ->where($matchThese) // 处理main_category的逗号分隔查询(补上单个值的边界情况) ->where(function($query) use ($companyNameSearch) { $query->where('main_category', 'like', "%,$companyNameSearch,%") ->orWhere('main_category', 'like', "$companyNameSearch,%") ->orWhere('main_category', 'like', "%,$companyNameSearch") ->orWhere('main_category', '=', $companyNameSearch); }) ->paginate(3);
2. 模糊匹配JSON中的值(用数据库原生函数)
如果需要模糊搜索(比如搜"hite"也能找到"hitech"),whereJsonContains就不适用了,这时候可以用MySQL的JSON_SEARCH函数来实现,通过DB::raw调用:
$companyNameSearch = $request->input('company_name'); $matchThese = [ 'country' => $request->input('country'), 'main_category' => $request->input('main-category'), ]; $companies = Company::where(function($query) use ($companyNameSearch) { // 用JSON_SEARCH查找包含模糊匹配值的记录 $query->whereRaw('JSON_SEARCH(company_name, "one", ?) IS NOT NULL', ["%$companyNameSearch%"]); }) ->where($matchThese) ->where(function($query) use ($companyNameSearch) { $query->where('main_category', 'like', "%,$companyNameSearch,%") ->orWhere('main_category', 'like', "$companyNameSearch,%") ->orWhere('main_category', 'like', "%,$companyNameSearch") ->orWhere('main_category', '=', $companyNameSearch); }) ->paginate(3);
修正你原来的查询逻辑问题
你之前的代码里where($matchThese)->orWhere($matchThese)会导致逻辑混乱,可能会出现不符合条件的记录被错误筛选出来。正确的做法是把所有OR条件都放在闭包内,确保逻辑分组正确(比如把JSON搜索和main_category搜索的OR条件放在同一个闭包,再和$matchThese的AND条件组合)。
内容的提问来源于stack exchange,提问作者abdullah
相关产品推荐
相关产品推荐

