Laravel 8 如何按adm_email字段分组查询获取每个管理员对应的项目列表
解决方案
你原来的写法问题出在SQL层面的GROUP BY只会返回每个分组的单条记录,无法拿到同一邮箱下的所有项目,用下面两种方案都可以实现需求:
方案1:使用Laravel集合分组(推荐,写法简单适配大多数场景)
// 第一步查询出所有关联的项目和对应邮箱数据 $list = Projet::join('filiales','projets.id_filiale','=','filiales.id_filiale') ->select('projets.nom_projet','filiales.adm_email') ->get(); // 第二步用集合的groupBy方法按邮箱分组,提取每个分组的项目名称 $result = $list->groupBy('adm_email') ->map(function ($item) { return $item->pluck('nom_projet')->all(); }) ->all();
得到的$result就是你要的adm_email => [nom_projet1, nom_projet2...]的结构。
方案2:SQL层面聚合(适合数据量较大的场景)
如果项目数据量很大,先全量查再分组性能低,可以用SQL的GROUP_CONCAT函数先聚合项目名称,再拆分:
$result = Projet::join('filiales','projets.id_filiale','=','filiales.id_filiale') ->selectRaw('filiales.adm_email, GROUP_CONCAT(projets.nom_projet SEPARATOR "|||") as project_names') ->groupBy('filiales.adm_email') ->get() ->mapWithKeys(function ($item) { return [$item->adm_email => explode('|||', $item->project_names)]; }) ->all();
这里用|||做分隔符是为了避免项目名本身包含逗号导致拆分错误,你可以根据实际业务调整分隔符。
内容的提问来源于stack exchange,提问作者saadia
相关产品推荐
相关产品推荐

