【问题标题】:Adding a count column for a filtered relationship to a select with a subquery in Laravel Eloquent在 Laravel Eloquent 中使用子查询将过滤关系的计数列添加到选择中
【发布时间】:2019-11-10 11:26:27
【问题描述】:

假设我有一个包含四个模型的 Laravel 5.5 应用:

ClassStudentAssignmentAssignmentSubmission

Class 属于许多 StudentsStudent 属于许多 ClassesAssignmentSubmission 属于 AssignmentUserClass

所以表格看起来像这样:

classes:
  id
  name

students:
  id
  name

class_student:
  class_id
  student_id

assignments:
  id
  name

assignment_submissions:
  id
  class_id
  student_id
  assignment_id

现在,在查询构建器类中,我需要构造一个查询,该查询返回属于ClassStudents,并带有一个名为total_assignment_submissions 的额外列,其中记录学生提交了多少作业仅限该类。

我的第一个停靠港如下:

$class->students()->withCount('assignmentSubmissions')->get();

但这会返回该学生在所有课程中提交的作业总数。

以下 mySql 查询返回正确的数据:

SELECT *,
       (SELECT Count(*)
        FROM   `assignment_submission`
        WHERE  `student_id` = `students`.`id`
               AND `class_id` = ?) AS total_assignment_submissions
FROM   `students`
       INNER JOIN `class_student`
               ON `students`.`id` = `class_student`.`student_id`
WHERE  `class_student`.`class_id` = ?

但我似乎无法以正确的顺序拨打selectSub() addSelect()raw() 来获得我想要的东西。似乎我只使用原始查询执行此操作,但事件 id 将未经处理,否则我可以执行此操作,但它仅返回 assignment_count 字段,而不返回 student 的其余字段。

$class->students()
    ->selectSub(
        AssignmentSubmission::selectRaw('count(*)')
            ->whereClassId($class->id)->getQuery(), 
            'total_assignment_submissions'
    )->toSql();

必须有办法做到这一点。我在这里错过了什么?

【问题讨论】:

    标签: php sql laravel eloquent subquery


    【解决方案1】:

    withCount() 可以被约束。

    $class->students()->withCount(['assignmentSubmissions' => function($q) use($course_id){
        $q->where('course_id', $course_id);
    }])->get();
    

    这会将计数限制为该特定课程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 2015-01-24
      • 2014-01-15
      • 2021-12-24
      • 2014-12-10
      • 1970-01-01
      相关资源
      最近更新 更多