簡體   English   中英

在Laravel Eloquent中使用子查詢為選擇的關系添加計數列

[英]Adding a count column for a filtered relationship to a select with a subquery in Laravel Eloquent

假設我有一個帶有四個模型的Laravel 5.5應用程序:

ClassStudentAssignmentAssignmentSubmission

一個Class屬於許多Students ,一個Student屬於多個Classes ,一個AssignmentSubmission屬於一個Assignment ,一個User和一個Class

因此表如下所示:

classes:
  id
  name

students:
  id
  name

class_student:
  class_id
  student_id

assignments:
  id
  name

assignment_submissions:
  id
  class_id
  student_id
  assignment_id

現在,在查詢生成器類我需要構建一個返回查詢Students屬於一個Class有一個額外的列名為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();

必須有一種方法可以做到這一點。 我在這里想念什么?

withCount()可以被約束。

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

這會將計數限制為該特定課程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM