卡在Laravel查询中

时间:2018-09-16 14:14:40

标签: php mysql laravel

尝试在控制器中进行查询。

我在数据库中有两个表:

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();

但是什么都没出现。

3 个答案:

答案 0 :(得分:0)

如果您的关系正确,那将是这样:

$girls = StudentMark::whereHas('student', function($q) {
    $q->where('gender', 'female');
})->count();

学生是studentMark中的关系函数。每个模型都应该是单例。

答案 1 :(得分:0)

您需要研究Laravel多态性。对于您的情况,您需要以这种方式使用belongsTohasMany对象。

在您的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,这是每个学生的学生成绩计数。