Laravel框架join关联查询新增teacher表无返回,缺失什么内容?
问题根因
你当前使用的是inner join(Laravel中join()方法默认的关联类型)同时关联students和teacher两张表,关联条件均为和users.email匹配:
inner join要求所有关联的表必须同时存在满足条件的记录,才会返回最终结果- 正常校园业务逻辑中,同一个用户的邮箱不可能同时出现在学生表和教师表中,因此没有符合所有关联条件的记录,查询返回空结果。
修复方案
把students和teacher的关联改为leftJoin左连接即可,左连接会保留主表users的所有记录,关联表没有匹配记录时对应字段会返回null,不会过滤主表有效数据。
修正后的代码如下:
$questions = DB::table('questions') ->select( 'questions.id', 'questions.role', 'questions.postBody', 'questions.classCode', 'questions.postedById', 'questions.created_at', 'classroom.classroomName', 'classroom.icon', 'users.picture', 'students.firstName', 'students.middleName', 'students.lastName', 'students.suffix', 'students.studentNumber', 'teacher.email as teacher_email' // 建议设置别名避免和users.email重名覆盖 ) ->join('classroom', 'classroom.classCode', '=', 'questions.classCode') ->join('users', 'users.id', '=', 'questions.postedById') ->leftJoin('students', 'students.email' , '=', 'users.email') // 改为左连接 ->leftJoin('teacher', 'teacher.email' , '=', 'users.email') // 改为左连接 ->orderBy('questions.created_at', 'DESC') // 原手写分页逻辑存在边界问题,page<5时skip为负数会抛出SQL错误,建议用Laravel自带分页 // ->skip($request->page - 5) // ->take($request->page) ->paginate(10); // 直接调用paginate方法,参数为每页展示条数,自动处理分页逻辑
额外优化建议
- 后续业务逻辑中可以通过
questions.role字段判断发布者身份,按需读取学生或教师的对应字段即可 - 如果确认你的业务中需要同时存在既是学生又是教师的身份,可先检查
teacher表的字段、数据是否正常,关联条件的字段是否存在拼写错误。
内容的提问来源于stack exchange,提问作者user10182078
相关产品推荐
相关产品推荐

