Laravel Collection按JSON字段father_name分组失效,如何解决?
解决Laravel中JSON字段分组失效的问题
问题原因
你当前的代码先用get()把所有数据拉到PHP内存中,再调用集合的groupBy,但以下两个原因导致分组失效:
- 如果
Student模型没有对father_details字段做JSON转换,该字段会以字符串形式返回,无法通过father_details->father_name提取到父名; - 集合的
groupBy针对数组嵌套字段应该用.语法,而非->(->适用于对象属性访问)。
解决方案
方案1:模型中配置JSON字段转换(推荐,适合小数据量)
在Student模型中添加$casts属性,将father_details字段自动转换为数组:
class Student extends Model { protected $casts = [ 'father_details' => 'array', ]; }
之后就可以用集合的groupBy正确分组:
$students = Student::get()->groupBy('father_details.father_name');
方案2:数据库层面分组(高效,适合大数据量)
直接在数据库中提取JSON字段的father_name并分组,避免把全量数据拉到内存。以MySQL为例:
MySQL 8.0+ 版本(支持->>语法)
$students = Student::select('*') ->selectRaw('father_details->>"$.father_name" as father_name') ->groupBy('father_name') ->get();
MySQL 5.7+ 版本
$students = Student::select('*') ->selectRaw('JSON_UNQUOTE(JSON_EXTRACT(father_details, "$.father_name")) as father_name') ->groupBy('father_name') ->get();
内容的提问来源于stack exchange,提问作者Hamid Raza
相关产品推荐
相关产品推荐

