Php 在Laravel中使用Join和Group By进行计数

Php 在Laravel中使用Join和Group By进行计数,php,laravel,Php,Laravel,我们有以下几张表 我们希望输出如下 这是我们到目前为止所做的,我指的是查询 $enrolledStudents = Student::select('students.subject_id', 'subjects.subject_name as subject_name', DB::raw('count(subject_id) as total')) ->leftJoin('subjects', 'subjects.id', '=', 'students.subjec

我们有以下几张表

我们希望输出如下

这是我们到目前为止所做的,我指的是查询

$enrolledStudents = Student::select('students.subject_id', 'subjects.subject_name as subject_name', DB::raw('count(subject_id) as total'))
        ->leftJoin('subjects', 'subjects.id', '=', 'students.subject_id')
        ->groupBy('students.subject_id')
        ->get();
此查询不起作用

语法错误或访问冲突:1055“subject.subject\u name”不在GROUP BY中


我们可以做些什么来获取预期输出

只选择聚合或存在于group by子句中的列,例如
主题名称
未聚合或group by子句的一部分,因此在严格模式下,数据库将抛出此错误,因为不允许此操作

此外,您应该使用科目模型作为联接的左表,这样即使没有注册学生,您也可以获得所有科目

Subject::from('subjects as s')
        ->select('s.subject_name', DB::raw('count(s.id) as total'))
        ->leftJoin('students as st', 's.id', '=', 'st.subject_id')
        ->groupBy('s.subject_name')
        ->get();
或者,如果您已经定义了科目和学生模型之间的关系,则可以使用
withCount()


如果您确实不想使用任何其他列进行分组,则应config\database.php文件中将strict设置为false,并运行php artisan config:clear和config:cache

    'mysql' => [
        'strict'    => false,
    ],

你能定义不工作吗?这个查询的结果是什么?你能加上你的邮资吗,请检查一下!谢谢,它成功了,我希望我能做第二个,但今天必须发布修复程序:P@MissingSemicolon这对开发者来说是可怕的一天:)你可以在发布后计划,干杯一个问题,我如何从主题表中获取主题id?我试过这样做,但我得到了以下错误
语法错误或访问冲突:1055'db.subjects.id'不在groupBy
@missing分号您需要在groupBy中添加
subject\u id
,也可以像
select('subject\u id','subject\u name')
groupBy('subject\u id','subject\u name')
    'mysql' => [
        'strict'    => false,
    ],