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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:05:51