Использование Laravel для запроса таблицы при группировке и усреднении

У меня есть таблица под названием Assessment_data: Использование Laravel для запроса таблицы при группировке и усреднении

Он собирает оцениваемый_уровень для данной комнаты / идентификатора оценки / предмета / единицы / результата ряда студентов по определенному предмету.

Это мой запрос Laravel:

$assessment_tally_levels = DB::table('assessment_data')
    ->join('subjects', 'assessment_data.subject_id', '=', 'subjects.id')
    ->select('subjects.short_name as Subject', 'assessment_data.assessed_level as Level', DB::raw('count(*) as Students'))
    ->where('assessment_data.user_id', Auth::id()) 
    ->where('assessment_data.room_id', $room_id)
    ->whereBetween('assessment_data.created_at', [$current_term->term_start." 00:00:01", $current_term->term_end." 23:59:59"])
    ->orderByRaw('assessment_data.assessed_level ASC')
    ->groupBy('assessment_data.subject_id')
    ->groupBy('assessment_data.assessed_level')
    ->get()
    ->toJson();

В качестве вывода JSON я получаю следующее:

[{"Subject":"Science","Level":1,"Students":16},{"Subject":"Phys Ed","Level":1,"Students":1},{"Subject":"Math","Level":1,"Students":1},{"Subject":"ELA","Level":1,"Students":2},{"Subject":"Art","Level":2,"Students":1},{"Subject":"Science","Level":2,"Students":23},{"Subject":"CTF","Level":2,"Students":1},{"Subject":"Math","Level":2,"Students":3},{"Subject":"ELA","Level":2,"Students":3},{"Subject":"Phys Ed","Level":2,"Students":3},{"Subject":"Phys Ed","Level":3,"Students":3},{"Subject":"Art","Level":3,"Students":1},{"Subject":"Science","Level":3,"Students":40},{"Subject":"Health","Level":3,"Students":4},{"Subject":"CTF","Level":3,"Students":4},{"Subject":"Math","Level":3,"Students":4},{"Subject":"ELA","Level":3,"Students":4},{"Subject":"Phys Ed","Level":4,"Students":4},{"Subject":"Science","Level":4,"Students":41},{"Subject":"Art","Level":4,"Students":4},{"Subject":"Health","Level":4,"Students":2},{"Subject":"CTF","Level":4,"Students":1},{"Subject":"Math","Level":4,"Students":4},{"Subject":"ELA","Level":4,"Students":3}]

Проблема в том, что в классе нет 40 учеников (как это указано в строке «Уровень естествознания 3» выше).

Вот ссылка на полный набор данных из приведенного выше примера (не знал, как еще поделиться с вами этими данными): https://docs.google.com/spreadsheets/d/1swc9AVLp0ZVDJw3UntgpSDQTSB2MaSunVul7zR0kNf8/edit?usp=sharing

Мне нужно сгруппировать студентов вместе по их student_id и усреднить все оцененные_уровни этого студента для предмета вместе, чтобы получить единый результат для студента.

Как я могу это сделать?

Какие у вас красноречивые отношения на вашей модели Student? Причина, по которой я спрашиваю, заключается в том, что такой запрос было бы намного проще, если бы вы могли сделать что-то вроде Students:all()->with('assessments.results')->groupBy('assess‌​ments.subject.shortn‌​ame');.

Spholt 01.05.2018 16:04

Попробуйте count(distinct student_id) as Students.

Jonas Staudenmeir 01.05.2018 17:43

@Spholt - Мне, наверное, действительно стоит освежить свои навыки красноречия. Каждый раз, когда запрос выходит за рамки однозначного, я просто перехожу в Query Builder для простоты (в начале). Предоставленный вами запрос выглядит красиво. В данном конкретном случае есть только две таблицы: одна для размещения данных оценки, а другая для названий жилищных субъектов. Я предполагаю, что это будет не так уж сложно настроить с помощью Eloquent ...?

Sheldon Scott 01.05.2018 22:52

@JonasStaudenmeir - это собрало студентов вместе. Есть ли способ округлить вверх / вниз студентов, у которых есть что-либо, кроме целого числа, чтобы они были объединены в те же 4 уровня целых чисел (1, 2, 3 и 4), что и другие студенты? Прямо сейчас у меня есть пара детей с оценками «2,87», «3,25» и «3,4». Я бы хотел, чтобы они были округлены до «3», «3» и «3» соответственно. (Извините, я знаю, что это выходит за рамки этой OP.

Sheldon Scott 01.05.2018 22:57

Можно опубликовать запрос, вычисляющий среднее значение?

Jonas Staudenmeir 01.05.2018 23:08

Отмените этот запрос. Не могли бы вы опубликовать свой ответ, @JonasStaudenmeir. Это было решение. :)

Sheldon Scott 01.05.2018 23:23

@SheldonScott рад видеть, что у вас все работает :). Если вы предпочитаете использовать построитель запросов, то обязательно сделайте это, но я бы посоветовал взглянуть на документы Laravel для Eloquent ORM (laravel.com/docs/5.6/eloquent-relationships), стоит потратить время, чтобы понять некоторые другие отношения, доступные, поскольку он это самый мощный аспект Laravel, по крайней мере, на мой взгляд!

Spholt 02.05.2018 10:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
7
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В данный момент вы подсчитываете количество оценок.

Вы должны посчитать отдельных студентов:

DB::raw('count(distinct student_id) as Students')

Другие вопросы по теме