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
相关产品推荐
相关产品推荐

