#laravel
#laravel
Вопрос:
В моем приложении Laravel-5.8 у меня есть этот запрос в контроллере:
$school = Auth::user()->school_id;
$registrationTypeName = "Core";
$studentRegistrations = DB::table('my_classess AS c')
->leftJoin('students AS ch', function($join) use ($school)
{
$join->on('ch.id', '=', 'c.class_head_id')
->where('ch.school_id', '=', $school);
})
->leftJoin('students AS s', function($join) use ($student)
{
$join->on('c.id', '=', 's.class_id')
->where('s.school_id', '=', $school);
})
->leftJoin('registrations AS r', function($join) use ($school)
{
$join->on('s.id', '=', 'r.student_id')
->where('r.company_id', '=', $school)
->where('r.is_registered', '1');
})
->join('registration_types AS rt', function($join) use ($school, $registrationTypeName)
{
$join->on('r.registration_type_id', '=', 'rt.id')
->where('rt.school_id', '=', $school)
->where('rt.registration_type', 'LIKE', '%'.$registrationTypeName.'%');
})
->where('c.school_id', '=', $school)
->select(
'c.class_name',
DB::raw('COALESCE(CONCAT(ch.first_name, " ", ch.last_name), "None") AS class_head'),
DB::raw('COALESCE(COUNT(r.id), "0") AS total_registered'),
DB::raw('COALESCE(COUNT(s.id), "0") AS total_students'),
)
->groupby('c.id')
->get();
Приведенный выше код работает нормально.
Но из того же запроса я хочу получить еще один столбец с именем total_unregistered путем вычитания total_registered из total_student как:
total_unregistered = total_student — total_registered
Я сделал это:
DB::raw('SUM(total_student - total_registered) as total_unregistered'),
но получил ошибку:
производство.ОШИБКА: SQLSTATE[42S22]: столбец не найден: 1054 неизвестных столбца ‘total_student’
Как мне этого добиться?
Спасибо
Комментарии:
1. Мой совет — разбить этот запрос на более мелкие части, поскольку он и так делает слишком много. Кроме того, этот запрос, вероятно, не должен находиться в контроллере — получение подобных данных должно выполняться в другом месте, например, в классе service или repository. Роль контроллера обычно заключается в том, чтобы просто подтвердить запрос, а затем переслать его куда-нибудь еще.
Ответ №1:
production.ERROR: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'total_student'
В ваших вычислениях используется столбец «total_student», но правильный псевдоним столбца — «total_students», заканчивающийся на «s»
Ответ №2:
вы не можете использовать столбцы псевдонимов в операторах select ….
вы должны пересчитать его:
->select(
'c.class_name',
DB::raw('COALESCE(CONCAT(ch.first_name, " ", ch.last_name), "None") AS class_head'),
DB::raw('COALESCE(COUNT(r.id), "0") AS total_registered'),
DB::raw('COALESCE(COUNT(s.id), "0") AS total_students'),
DB::raw('(COALESCE(COUNT(s.id), 0)-COALESCE(COUNT(r.id), 0)) as total_unregistered ')
)