Как получить среднее значение таблицы отношений? ларавель

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