我有一个具有hasMany students关系的教室模型。我想用雄辩的构建器在一个查询中检查每个教室是否有学生。我也不想退出学生计数。has函数过滤没有学生的教室:
//Classroom model
class Classroom extends Model
{
public function students(): HasMany
{
return $this->hasMany(Student::class);
}
}
尝试使用:
Classroom::has('students')->get();
但它只返回有学生的模型,而不是我想要的。预期结果:
[
{
"has_students": false
},
{
"has_students": false
},
{
"has_students": true
},
{
"has_students": true
},
{
"has_students": false
}
]
4条答案
按热度按时间f4t66c6m1#
作为Amade的回答的后续,我们现在有一个
withExists
方法来检查关系的存在性。所以你应该可以这样做:然后,每个
Classroom
对象将有一个名为students_exists
的属性(属性)(我相信是基于文档)。如果你愿意,你可以将其别名为has_students
:我没有测试过这个,但根据文档,这应该是你正在寻找的。
如果希望返回特定的数据结构,可以执行Amade演示的
mapWithKeys
方法或使用转换器(API参考资料)。Laravel 10.x Docs - Eloquent - Relationships - Other Aggregates -
withExists
6za6bjd02#
您可以通过以下方式实现:
也就是说,使用Eqloquent将classes表与每个教室中的学生计数连接起来,然后将结果与您的条件进行Map。
dm7nw8vv3#
尝试添加has_stuents属性访问器
iqih9akk4#
您可以向Classroom模型添加一个“hasStudents”方法,该方法使用“exists”方法来检查是否有任何学生与该类相关联。下面是一个示例代码:
然后,要获取具有“has_students”属性的对象数组,该属性指示每个班级是否有学生,您可以运行查询以检索所有教室并使用“map”方法创建所需的数组:
最后,您可以使用“toJson”方法将$classroomData转换为JSON:
这将为每个类生成具有“has_students”属性的所需JSON数组。