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

Laravel Eloquent:如何查询多维JSON数组中含指定Term的活动

问题分析与解决方案

你的代码无法生效的核心原因是:Laravel的whereJsonContains不支持使用*作为通配符来匹配JSON结构中任意层级的动态键,所以['attribute.*.terms.'.$slug.'' => 1]这种写法无法正确定位到嵌套的terms字段。

针对你的JSON结构,以下是可行的解决方案:

针对MySQL数据库

方法1:使用JSON_CONTAINS_PATH检查键存在

如果只需要确认指定slug存在(不管值是什么),可以用这个方法:

$slug = 'parasailing';
$activities = Activity::whereRaw(
    "JSON_CONTAINS_PATH(attributes, 'one', '$.attribute.*.terms.$slug')"
)->get();
  • 'one'表示只要存在任意一个匹配的路径即满足条件
  • $.attribute.*.terms.$slug中的*会匹配所有顶级attribute键(比如adventure、water-sport)

方法2:使用JSON_SEARCH精准匹配键值

如果需要严格确保slug对应的值为1,可以用这个写法:

$slug = 'parasailing';
$activities = Activity::whereRaw(
    "JSON_SEARCH(attributes, 'one', '1', null, '$.attribute.*.terms.$slug') IS NOT NULL"
)->get();

JSON_SEARCH会在指定路径下查找值为1的节点,返回非空结果即表示符合条件。

针对PostgreSQL数据库

如果你的项目用PostgreSQL,需要使用jsonb_path_exists函数:

$slug = 'parasailing';
$activities = Activity::whereRaw(
    "jsonb_path_exists(attributes, '$.attribute.*.terms.$slug ? (@ == \"1\")')"
)->get();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:24:56