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

Laravel Collection按JSON字段father_name分组失效,如何解决?

解决Laravel中JSON字段分组失效的问题

问题原因

你当前的代码先用get()把所有数据拉到PHP内存中,再调用集合的groupBy,但以下两个原因导致分组失效:

  1. 如果Student模型没有对father_details字段做JSON转换,该字段会以字符串形式返回,无法通过father_details->father_name提取到父名;
  2. 集合的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:10:11