【问题标题】:Laravel: query with a different where condition in a different rowLaravel:在不同的行中使用不同的 where 条件进行查询
【发布时间】:2021-09-02 19:24:31
【问题描述】:

我有一个带有不同值的“配额”列的教室表。一个班,有很多学生。如何以where 条件显示每个row < "quota" 的学生总数?这是表格:

代码:

Classroom::with('subject.teacher')->with('students')->whereHas('subject', fn ($query) => $query->where('grade', $grade))->withCount('students')->having('students_count', '<', 'quota');

当我使用此代码时,结果为空

当“有”被删除时,结果如下:

想要的结果只显示 3 个教室

【问题讨论】:

  • 它给出了一个错误结果“未找到列:1054 '有子句'中的未知列'学生'”

标签: laravel eloquent laravel-8


【解决方案1】:

withCount 函数将一个额外的选择列附加到您的查询中。它不使用GROUP BY,而GROUP BY 通常与having 结合使用。

您实际上不能按选择中添加的子查询进行过滤。不过幸运的是,Laravel 允许您根据使用 has 的相关模型的数量来选择行。此查询也作为子查询添加,但在 where 子句中,因此您也可以在其中使用列名,如下所示:

Classroom::with('subject.teacher')
    ->with('students')
    ->whereHas('subject', fn ($query) => $query->where('grade', $grade))
    ->has('students', '<', \DB::raw('quota')) 
    ->withCount('students');

【讨论】:

  • 它给出了一个错误结果“Column not found: 1054 Unknown column 'students_count' in 'where Clause'”
  • @php 对不起我的错误。我已经更新了
  • 是的,这是完整的查询,谢谢@apokryfos
【解决方案2】:

您可以使用hasDB::raw

// Simplified version
Classroom::has('students', '<=', DB::raw('classrooms.quota'))->get();

【讨论】:

    猜你喜欢
    • 2012-08-28
    • 2018-07-13
    • 2020-12-31
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 2017-01-28
    • 2015-09-26
    相关资源
    最近更新 更多