如何用Eloquent一次性查询所有教室是否存在学生关联
实现方案
你可以通过两种方式完成一次查询,获取所有教室对应的has_students布尔值:
方法一:使用withExists(Laravel 5.8+ 推荐)
Laravel内置了专门用于判断关联是否存在的withExists方法,写法简洁且贴合Eloquent风格:
$classrooms = Classroom::withExists(['students as has_students']) ->get() ->pluck('has_students');
withExists会自动生成EXISTS子查询,检查当前教室是否关联有学生,结果以指定的has_students字段返回- 调用
pluck('has_students')直接提取目标字段,最终得到的集合转成数组就是你需要的格式
方法二:手动编写selectRaw子查询
如果你的Laravel版本较低,或者需要更灵活的自定义查询,可以直接写原生SQL的EXISTS子查询:
$classrooms = Classroom::selectRaw('EXISTS(SELECT 1 FROM students WHERE students.classroom_id = classrooms.id) AS has_students') ->get() ->pluck('has_students');
- 这里通过
EXISTS语句判断当前教室是否存在关联学生,返回布尔值并命名为has_students - 同样通过
pluck提取目标字段,得到所需的结果数组
两种方法都只会执行一次数据库查询,不会加载学生数据,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Manuel Guzman
相关产品推荐
相关产品推荐

