You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:15:40