Laravel关联查询统计用户数报role_user.id不存在错误解决方法
报错原因
role_user是用户与角色多对多关系的中间表,默认不存在id字段,查询构造器中关联roles表时错误使用role_user.id作为关联键,触发字段不存在报错。
错误代码定位
出错的是第二处join的关联条件:
// 错误写法,中间表role_user无id字段 ->join('roles', 'role_user.id', '=', 'roles.id')
原构造器还缺少原生SQL中查询的角色名字段,和正常运行的SQL返回结构不一致。
修复方案
将关联条件修改为用中间表的role_id字段关联角色表主键id即可,和原生SQL逻辑完全对齐的代码如下:
// 如需同时返回角色名和对应用户数,用以下写法 $roleUserData = DB::table('users as u') ->select('r.name', DB::raw('count(u.id) AS countUser')) ->join('role_user as ru', 'u.id', '=', 'ru.user_id') ->join('roles as r', 'ru.role_id', '=', 'r.id') ->groupByRaw('r.id, r.name') ->get(); // 若仅需要各角色用户数的一维数组,可直接用pluck取数 $countUser = DB::table('users as u') ->select(DB::raw('count(u.id) AS countUser')) ->join('role_user as ru', 'u.id', '=', 'ru.user_id') ->join('roles as r', 'ru.role_id', '=', 'r.id') ->groupByRaw('r.id') ->pluck('countUser');
提示:MySQL 5.7及以上版本默认开启
only_full_group_by模式,select查询的非聚合字段必须加入groupBy规则,查询角色名时需要将r.name一并加入分组规则,避免触发SQL模式报错。
内容的提问来源于stack exchange,提问作者baihaqi
相关产品推荐
相关产品推荐

