Застрял в запросе Laravel - PullRequest
       5

Застрял в запросе Laravel

0 голосов
/ 16 сентября 2018

Попытка выполнить запрос в контроллере.

У меня есть две таблицы в базе данных:

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 голосов
/ 16 сентября 2018

Вам необходимо изучить полиморфизм Ларавела.В вашем случае вам необходимо использовать объекты 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.

0 голосов
/ 16 сентября 2018

Что вы можете сделать, это перейти к 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, который является количеством оценок учеников для каждого ученика.

0 голосов
/ 16 сентября 2018

Если у вас правильные отношения, это будет примерно так:

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

Где студенты - это функция отношений в studentMark.Каждая модель должна быть синглтон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...