#php #laravel #eloquent
Вопрос:
Есть ли красноречивый способ получить среднее значение из таблицы отношений? Здесь у меня есть 2 стола.
Я могу получить среднее значение по всем экзаменам , используя withAvg
, но я также хочу получить среднее значение по каждому экзамену (см. Ожидаемый результат). Может ли кто-нибудь дать представление о том, как это сделать? Спасибо
Модели:
Student (students)
- id
- name
Exam (exams)
- id
- title
- is_correct
- student_id
StudentExam (studentExams)
- id
- section
Я попробовал это, и оно работает нормально.
StudentExam::whereSection(1)
->with('exams')
->withAvg('exams AS total_avg_exams', 'is_correct);
->first();
Это приводит к:
{
section: 1,
total_avg_exams: 0.63,
exams: [{},{}],
}
ожидаемый результат будет:
{
section: 1,
total_avg_exams: 0.63,
exams: [
{
avg_exams: 0.83,
...
},
{
avg_exams: 0.63,
...
}
]
}
Ответ №1:
Вам нужно сгруппировать экзамены в заявлении «С». Я буду считать, что все экзамены, которые связаны, имеют одно и то же название, так что это должно быть что-то вроде этого.
use IlluminateSupportFacadesDB;
StudentExam::whereSection(1)
->with(['exams' => function($query){
//You need the title for grouping
//You will need the student id for the eager loading so relation works
//is_correct is needed for the query
return $query->select(
'title',
'student_id',
'is_correct',
DB::raw('avg(is_correct) as total_avg_exams'))
->groupBy('title');
}])
->withAvg('exams AS total_avg_exams', 'is_correct');
->first();