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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 21:32:13