Laravel Eloquent如何查询长度为指定值的数组字段记录
问题说明
需要统计bullets数组字段中,数组长度恰好为5的记录总数。原有查询使用LENGTH()函数做判断,该函数仅计算字段值的字符/字节长度,无法识别数组元素个数,因此返回结果错误。原有错误代码如下:
$vcount = Variation::where('user_id', user_id)->whereRaw('LENGTH(bullets) = 5')->count();
正确实现方法
根据bullets字段的存储格式,选择对应方案:
如果
bullets是MySQL原生JSON类型字段(Laravel模型中配置了array/json类型 cast)
直接使用MySQL提供的JSON_LENGTH()函数替换原有的LENGTH()即可,该函数会返回JSON数组的元素个数:$vcount = Variation::where('user_id', $user_id) ->whereRaw('JSON_LENGTH(bullets) = 5') ->count();提示:如果数组是嵌套在JSON结构的某个子路径下,需要给
JSON_LENGTH()传入第二个路径参数,例如存放在content节点下的数组要写为JSON_LENGTH(bullets, '$.content')。如果
bullets是通过PHP序列化后以字符串形式存储(非JSON格式)
数据库层面无法直接识别序列化字符串的数组结构,可先取出对应字段值,通过Laravel集合方法做统计:$vcount = Variation::where('user_id', $user_id) ->pluck('bullets') ->filter(fn($item) => is_array($item) && count($item) === 5) ->count();注意:该方案会把符合
user_id条件的所有记录的bullets字段加载到内存,如果匹配的记录量级超过10万,会产生较高内存占用,优先建议将字段调整为JSON类型使用第一种方案查询,性能更好。
内容的提问来源于stack exchange,提问作者Christine Treacy
相关产品推荐
相关产品推荐

