Laravel关联查询两次关联users表获取指派人、创建人角色报错如何解决
多表关联查询双用户角色解决方案
错误原因
- 语法错误:第二个
leftJoin参数中ca.user_name后多写了一个右括号,导致查询构造器链式调用提前中断返回数组,后续调用whereIn方法时抛出Call to a member function whereIn() on array错误 - 表名/字段名不匹配:主表为
meeting,关联时错误使用了未定义的meeting_after_validation表;created_by_user_name字段被错写为created_by_name;user_roles表主键是id,whereIn中错误使用了不存在的carole.is字段 - 字段重名风险:两个角色字段都叫
role,不设置别名会导致查询结果中后返回的角色值覆盖前一个的结果
正确实现代码
$meetings = DB::table('meeting') // 关联会议分配人对应的用户表 ->leftJoin('users', 'users.user_name', '=', 'meeting.assigned_username') // 关联会议创建人对应的用户表,设置别名避免表冲突 ->leftJoin('users as ca', 'ca.user_name', '=', 'meeting.created_by_user_name') // 关联分配人对应的角色表 ->leftJoin('user_roles', 'users.role', '=', 'user_roles.id') // 关联创建人对应的角色表,设置别名避免表冲突 ->leftJoin('user_roles as carole', 'ca.role', '=', 'carole.id') // 过滤创建人角色为1、2的记录 ->whereIn('carole.id', [1, 2]) // 所有字段设置别名避免重名覆盖 ->select( 'meeting.meeting_id', 'users.user_name as assigned_username', 'user_roles.role as assigned_user_role', 'ca.user_name as created_by_username', 'carole.role as created_by_user_role' ) ->get() ->toArray();
返回结果说明
按你的示例数据运行后,返回的结果会包含meeting_id为m1、m3的两条记录,分别对应分配人和创建人的角色信息,符合你的查询需求。
内容的提问来源于stack exchange,提问作者user3386779
相关产品推荐
相关产品推荐

