尝试在控制器中进行查询。
我在数据库中有两个表:
students: id,name, surname,gender
student_marks: id,student_id,year_id, subject_id, mark_id ...
我要算的是所有学生的性别标志 女性或男性。
$girls = StudentMarks::where('student_id','=',Student::where('gender','female')->value('id'))->count();
但是什么都没出现。
答案 0 :(得分:0)
如果您的关系正确,那将是这样:
$girls = StudentMark::whereHas('student', function($q) {
$q->where('gender', 'female');
})->count();
学生是studentMark中的关系函数。每个模型都应该是单例。
答案 1 :(得分:0)
您需要研究Laravel多态性。对于您的情况,您需要以这种方式使用belongsTo
和hasMany
对象。
在您的Student
模型中,添加以下功能
public function students_marks(){
return $this->hasMany(StudentMark::class);
}
在您的StudentMark
模型中,添加以下功能
public function student(){
return $this->belongsTo(Student::class, 'student_id', 'id');
}
查询时,请使用whereHas
子句进行如下查询
$student_marks = StudentMark::with('student')
->whereHas('student', function($student){
$student->where('gender', 'female');
})->get()->count();
这应该给您计数。据您所知,请访问Laravel Eloquent EagerLoading
。
答案 2 :(得分:0)
您可以做的是进入Student
模型并定义protected $withCount=['studnet_marks']
这将一直在student_marks
模型上急切加载Student
的计数。
因此,当您吸引一名学生时,您将拥有一个student_count
属性,其中包含student_marks
个计数。
然后您的查询应类似于:
Student::whereHas('student_marks')->groupBy('gender')->get();
基本上让所有学生拥有一个student_mark
,并且由于我们在学生模型中定义了withCount
,因此它将加载一个新属性student_mark_count
,这是每个学生的学生成绩计数。