Laravel框架中如何查询包含指定内容的JSON列数据?
解决JSON列模糊匹配查询问题
你的代码核心问题在于whereJsonContains是精确匹配JSON结构的方法,不支持%通配符做模糊查询,所以当前写法无法得到预期结果。要实现JSON数组中content字段包含指定关键词的查询,需要结合数据库的JSON函数处理,以下是针对MySQL的解决方案:
修改后的查询代码
$q = $request->get('q'); $posts = Post::query() ->where('active', true) ->where('published_at', '<=', Carbon::now()) ->latest('published_at') ->whereRaw('JSON_UNQUOTE(JSON_EXTRACT(content, "$[*].data.content")) LIKE ?', ["%$q%"]) ->paginate(10);
代码说明
JSON_EXTRACT(content, "$[*].data.content"):从content列的JSON数组中,提取所有元素的data.content值,返回JSON格式的结果数组JSON_UNQUOTE():去除JSON字符串的引号,将其转换为普通字符串格式- 最后通过
LIKE搭配通配符%实现模糊匹配
更简洁的写法(Laravel 5.6+)
可以直接用.访问JSON嵌套字段,简化whereRaw的写法:
$posts = Post::query() ->where('active', true) ->where('published_at', '<=', Carbon::now()) ->latest('published_at') ->whereRaw('content->"$[*].data.content" LIKE ?', ["%$q%"]) ->paginate(10);
注:如果使用PostgreSQL数据库,语法会略有差异,需要使用jsonb_path_query等对应函数,但上述方案适用于绝大多数MySQL场景。
内容的提问来源于stack exchange,提问作者farhad
相关产品推荐
相关产品推荐

