Laravel与MySQL如何筛选含指定JSON列键的行(忽略值)
解决方案
原生SQL写法
要筛选prefixes列中包含键名abc的行,需使用JSON_CONTAINS_PATH函数(而非JSON_CONTAINS),这个函数专门用于检查JSON文档中是否存在指定路径的键:
SELECT * FROM `units` WHERE JSON_CONTAINS_PATH(`prefixes`, 'one', '$.abc') LIMIT 1;
参数说明:
'one':只要存在任意一个指定路径就返回true;若需所有指定路径都存在,可替换为'all''$.abc':要检查的JSON键路径
Laravel Eloquent 写法
方法一:使用whereJsonContainsPath(Laravel 8.75+ 支持)
Laravel 8.75及以上版本提供了原生的whereJsonContainsPath方法,可直接实现需求:
$unit = Unit::whereJsonContainsPath('prefixes', '$.abc')->first();
如需同时检查多个键存在(比如abc和cde),可传入路径数组:
$unit = Unit::whereJsonContainsPath('prefixes', ['$.abc', '$.cde'])->first();
方法二:使用whereRaw兼容低版本
如果你的Laravel版本低于8.75,可通过whereRaw直接调用原生SQL:
$unit = Unit::whereRaw('JSON_CONTAINS_PATH(prefixes, "one", "$.abc")')->first();
原写法无效原因
你之前使用JSON_CONTAINS(prefixes, '%', '$."abc"')的问题在于:
JSON_CONTAINS的作用是检查JSON文档中是否包含指定值,而非检查键是否存在%不是JSON_CONTAINS支持的通配符,无法匹配任意值
内容的提问来源于stack exchange,提问作者bartek_zet
相关产品推荐
相关产品推荐

