Laravel 5.8如何查询meta字段JSON数据中匹配指定form_id的记录
原代码错误原因
- MySQL
JSON_CONTAINS函数语法使用错误,正确结构为JSON_CONTAINS(字段名, 待匹配JSON值, 匹配路径),原代码缺少语法闭合、路径参数,参数传递顺序也不符合要求 - 字段名
meta被双引号包裹,会被MySQL识别为普通字符串而非表字段,无法匹配实际存储的JSON数据
正确实现方案
方案1:Laravel 原生 JSON 查询(推荐)
Laravel 5.8 已经内置JSON字段查询支持,写法最简洁:
$formId = request()->id; $query->where('meta->form_id', $formId);
该方案要求运行环境为 MySQL 5.7 及以上版本,符合当前主流服务环境要求,查询结果和你的表结构匹配,传入
id=31时会返回id为1、2的两条记录。
方案2:修正后的原生SQL写法
如果你需要手写原生SQL实现,正确写法如下:
$formId = request()->id; $query->whereRaw('JSON_CONTAINS(meta, ?, \'$."form_id"\')', [json_encode($formId)]);
- 待匹配的值需要用
json_encode处理为JSON格式,符合JSON_CONTAINS的参数要求 - 第三个参数指定匹配路径
$."form_id",精准定位JSON中的form_id键
内容的提问来源于stack exchange,提问作者saj sta
相关产品推荐
相关产品推荐

