Laravel — как вычесть количество двух полей

#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 ')
            )