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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:41:03