[英]SQL generated by Laravel doesn't work, but if I run the SQL direct on PhpMyAdmin it works
I was trying to get the name of Users in my system and I use the following code on 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();
When I run the code I got the following error:当我运行代码时,出现以下错误:
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`)
But if I get the SQL code from the error above:但是,如果我从上面的错误中得到 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`
and I run the code on PhpMyAdmin, the code it works, but show me this warning message:我在 PhpMyAdmin 上运行代码,它工作的代码,但显示此警告消息:
Current selection does not contain a unique column. Grid edit, checkbox, Edit, Copy and Delete features are not available.
How can I fix that on Laravel?如何在 Laravel 上解决这个问题?
When you group rows with GROUP BY, the database doesn't know which row should be selected.当您使用 GROUP BY 对行进行分组时,数据库不知道应该选择哪一行。 You have to specifically tell the database which row to be shown, for example,
FIRST(name)
will select the first row of column name.您必须明确告诉数据库要显示哪一行,例如,
FIRST(name)
将 select 列名的第一行。
Except the column in GROUP BY, which will be unique.除了 GROUP BY 中的列,它将是唯一的。
So in your query, select *
won't work, you should add select()
and specify the field and aggregate function.因此,在您的查询中,
select *
将不起作用,您应该添加select()
并指定字段并聚合 function。
->select('users.name', DB::raw('FIRST(course_assessments.field_name)'))
users.name
is in GROUP BY so it doesn't need aggregate function, other fields need aggregate function. users.name
在 GROUP BY 中,因此不需要聚合 function,其他字段需要聚合 function。
Try this:尝试这个:
From:从:
$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();
To:至:
$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();
I am assuming assessment_submissions table contains canvas_assignment_id column.我假设assessment_submissions 表包含canvas_assignment_id 列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.