SQL, созданный Laravel, не работает, но если я запускаю SQL напрямую на phpMyAdmin, он работает

#php #laravel

Вопрос:

Я пытался получить имена пользователей в своей системе и использую следующий код на PHP Laravel:

 $course_assessments = CourseAssessment::where('canvas_assignment_id', '=', $canvas_assignment_id)
        ->join('assessment_submissions', 'assessment_submissions.courses_assessments_id', '=', 'course_assessments.id')
        ->join('users', 'users.id', '=', 'assessment_submissions.evaluated_user')
        ->groupby('users.name')
        ->get();
 

Когда я запускаю код, я получаю следующую ошибку:

 SQLSTATE[42000]: Syntax error or access violation: 1055 'laravel.course_assessments.id' isn't in GROUP BY (SQL: select * from `course_assessments` inner join `assessment_submissions` on `assessment_submissions`.`courses_assessments_id` = `course_assessments`.`id` inner join `users` on `users`.`id` = `assessment_submissions`.`evaluated_user` where `canvas_assignment_id` = 248302 group by `assessment_submissions`.`evaluated_user`)
 

Но если я получу SQL-код из приведенной выше ошибки:

 select * from `course_assessments` inner join `assessment_submissions` on `assessment_submissions`.`courses_assessments_id` = `course_assessments`.`id` inner join `users` on `users`.`id` = `assessment_submissions`.`evaluated_user` where `canvas_assignment_id` = 248302 group by `assessment_submissions`.`evaluated_user`
 

и я запускаю код на phpMyAdmin, код, который он работает, но покажите мне это предупреждающее сообщение:

 Current selection does not contain a unique column. Grid edit, checkbox, Edit, Copy and Delete features are not available. 
 

Как я могу исправить это на Ларавеле?

Ответ №1:

Когда вы группируете строки с помощью GROUP BY, база данных не знает, какую строку следует выбрать. Вы должны специально указать базе данных, какая строка будет отображаться, например, FIRST(name) будет выбрана первая строка имени столбца.

За исключением столбца в ГРУППЕ ПО, который будет уникальным.

Поэтому в вашем запросе, select * который не будет работать, вы должны добавить select() и указать поле и агрегатную функцию.

         ->select('users.name', DB::raw('FIRST(course_assessments.field_name)'))
 

users.name находится в группе ПО, поэтому ему не нужна агрегатная функция, другим полям нужна агрегатная функция.

Комментарии:

1. Я пытаюсь добавить ->выбрать(‘users.name’, DB::raw(‘ПЕРВЫЙ(users.name)’)) в моем запросе , но это не сработало. Я действительно не понимаю, как мне нужно использовать функцию select в моем запросе.

2. @fabiobh второй-это просто пример, так как я не знаю ваших имен полей, попробуйте изменить внутри FIRST() на ваше имя поля.

Ответ №2:

Попробуйте это:

От:

  $course_assessments = CourseAssessment::where('canvas_assignment_id', '=', $canvas_assignment_id)
            ->join('assessment_submissions', 'assessment_submissions.courses_assessments_id', '=', 'course_assessments.id')
            ->join('users', 'users.id', '=', 'assessment_submissions.evaluated_user')
            ->groupby('users.name')
            ->get();
 

Для:

  $course_assessments = CourseAssessment::where('assessment_submissions.canvas_assignment_id', '=', $canvas_assignment_id)
            ->join('assessment_submissions', 'assessment_submissions.courses_assessments_id', '=', 'course_assessments.id')
            ->join('users', 'users.id', '=', 'assessment_submissions.evaluated_user')
            ->groupby('users.name')
            ->get();
 

Я предполагаю, что таблица assessment_submissions содержит столбец canvas_assignment_id.

Комментарии:

1. Это не сработало, потому что таблица assessment_submissions НЕ содержит столбец canvas_assignment_id. Таблица course_assessment-это таблица, содержащая столбец canvas_assignment_id.

2. какая таблица содержит canvas_assignment_id?

3. замените assessment_submissions таблицей, содержащей canvas_assignment_id.

4. Таблица course_assessment содержит идентификатор canvas_assignment_id, я использую «course_assessment.canvas_assignment_id», но результат все равно выдает ту же ошибку.