簡體   English   中英

Cakephp 3 NOT IN查詢

[英]Cakephp 3 NOT IN query

我認為這是一種常見的模式,但是我找不到優雅的CakePHP實現方式。 想法是從列表中刪除已經選擇的值。 要使用Cake書中的示例:

table Students (id int, name varchar)
table Courses (id int, name varchar)
table CoursesMemberships (id int, student_id int, course_id int, days_attended int, grade varchar)

我要做的就是創建一個查詢,該查詢返回給定學生尚未注冊的課程,很可能是為了填充選擇下拉列表。

如果我不使用蛋糕,我會做類似的事情

select * from Courses where id not in 
    (select course_id from CoursesMemberships where student_id = $student_id)

或等效的NOT EXISTS子句,或外部連接欺騙,但您明白了。

我在Cake中為如何做到這一點感到困惑。 在我看來,這將是一個普遍的需求,但是我已經研究了一段時間,並嘗試了一些查詢想法,但無濟於事。

如果要使用子查詢,只需將查詢對象作為條件值,例如

$subquery = $Courses->CoursesMemberships
    ->find()
    ->select(['CoursesMemberships.course_id'])
    ->where(['CoursesMemberships.student_id' => $student_id]);

$query = $Courses
    ->find()
    ->where([
        'Courses.id NOT IN' => $subquery
    ]);

作為替代方案,還有Query::notMatching() (從CakePHP 3.1起),可用於選擇與相關記錄不匹配特定條件的記錄:

$query = $Courses
    ->find()
    ->notMatching('CoursesMemberships', function (\Cake\ORM\Query $query) use ($student_id) {
        return $query
            ->where(['CoursesMemberships.student_id' => $student_id]);
    });

也可以看看

在CakePHP 3中,您可以像這樣創建NOT IN查詢。

$query = $Courses->find()
    ->where(['id NOT IN' => $ids]);

在CakePHP 3中,您可以像這樣創建IN查詢。

$query = $Courses->find()
    ->where(['id IN' => $ids]);

您可以在CakePHP 3 Cookbook-創建IN子句中閱讀有關內容。

找到IMO最優雅的答案...使用notMatching()選項:

$data = $this->Courses->find("list")
                      ->notMatching("Students", 
                         function($q) use ($student_id) {
                            return $q->where(["Students.id"=>$student_id]);
                         }
                      );

這假設學生有許多課程,而課程有許多學生。

我認為這是最優雅的答案,因為它不依賴於任何SQL知識,並且僅代表我嘗試使用Cake語義實現的邏輯。

暫無
暫無

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

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