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

Laravel+PostgreSQL如何查询JSON列含指定元素的行?

嘿,这个场景我之前在项目里碰到过,Laravel结合PostgreSQL处理JSON列查询其实有不少靠谱的方案,给你梳理几种:

1. 优先用Eloquent的whereJsonContains方法

Laravel提供了专门的JSON查询方法whereJsonContains,对PostgreSQL的JSON/JSONB列支持很好,写法也很简洁。

情况1:agents是JSON数组(比如存储格式是["agent_123", "agent_456"])

如果你的agents列直接存的是代理ID的数组,直接用下面的代码就能匹配包含目标ID的行:

$targetAgentId = '123'; // 你的目标代理ID

$results = YourModel::whereJsonContains('agents', $targetAgentId)->get();

情况2:agents是嵌套JSON(比如存储格式是{"ids": ["123", "456"]})

如果代理ID嵌套在JSON对象的某个数组字段里,用点语法就能定位到嵌套数组:

$results = YourModel::whereJsonContains('agents->ids', $targetAgentId)->get();

情况3:agents是单个代理ID的JSON对象(比如{"id": "123"})

如果每个行的agents列是单个代理的JSON对象,你可以传入键值对来匹配:

$results = YourModel::whereJsonContains('agents', ['id' => $targetAgentId])->get();
2. 用查询构造器配合PostgreSQL原生JSON操作符

如果whereJsonContains满足不了你的需求(比如需要更复杂的匹配逻辑,或者想利用PostgreSQL的JSONB索引优化查询),可以用whereRaw或者DB::raw来写原生查询。

用@>操作符匹配数组(适用于JSONB列)

PostgreSQL的JSONB类型支持@>操作符,用来检查JSON数组是否包含指定元素,查询效率很高(如果建了索引的话):

$targetAgentId = '123';

// 注意要把目标ID转成JSON数组格式,再转成jsonb类型
$results = YourModel::whereRaw("agents @> ?::jsonb", [json_encode([$targetAgentId])])->get();

如果你的列是json类型而不是jsonb,把::jsonb改成::json就行。

用->>操作符匹配单个字段值

如果agents是JSON对象,你可以用->>操作符直接提取字段的文本值,然后和目标ID比较:

$results = YourModel::whereRaw("agents->>'id' = ?", [$targetAgentId])->get();

这个写法等价于Eloquent的where('agents->id', $targetAgentId),不过用原生写法有时候更灵活。

小提醒
  • 推荐把agents列的类型改成jsonb,比json类型查询更快,还能建索引优化性能;
  • 如果用whereJsonContains,要注意类型匹配:比如你的代理ID是字符串,查询时就传字符串,别传数字,不然PostgreSQL可能匹配不到。

内容的提问来源于stack exchange,提问作者Yves Gonzaga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:50:13