如何通过Eloquent在单个集合中获取每位教师的学生数量
合并查询获取活跃教师及对应学生数的实现方式
方法一:利用Eloquent关联预加载(推荐)
首先在Teacher模型中定义与Student的一对多关联:
// app/Models/Teacher.php public function students() { return $this->hasMany(Student::class); }
之后直接使用withCount方法,一次性查询活跃教师并统计对应学生数量:
$teachers = Teacher::where('teacher_status', 'active') ->withCount('students') ->get();
返回的每个Teacher实例会自动带上students_count属性,直接调用$teacher->students_count即可获取该教师的学生数。
方法二:查询构造器左连接+聚合统计
若不想依赖模型关联,可直接通过数据库查询构造器实现:
$teachers = DB::table('teachers') ->leftJoin('students', 'teachers.id', '=', 'students.teacher_id') ->where('teachers.teacher_status', 'active') ->select('teachers.*', DB::raw('count(students.id) as student_count')) ->groupBy('teachers.id') ->get();
这里用leftJoin保证无学生的活跃教师也会被返回,count(students.id)避免统计空值,最终结果集合中每个元素包含教师所有字段和student_count字段。
方法三:批量补全学生数(不推荐,存在N+1查询问题)
如果已经获取了教师集合,可通过遍历补全学生数,但此方法会触发多次查询,数据量大时性能较差:
$teachers = Teacher::where('teacher_status', 'active')->get(); $teachers->each(function ($teacher) { $teacher->student_count = $teacher->students()->count(); });
内容的提问来源于stack exchange,提问作者Ratul
相关产品推荐
相关产品推荐

