我认为这是一种常见的模式,但是我找不到优雅的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)

我要做的就是创建一个查询,该查询返回给定学生尚未注册的类(class),很可能是要填充选择下拉列表。

如果我不使用蛋糕,我会做类似的事情
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]);
    });

也可以看看
  • Cookbook > Database Access & ORM > Query Builder > Subqueries
  • Cookbook > Database Access & ORM > Retrieving Data & Results Sets > Using notMatching
  • Cookbook > Database Access & ORM > Query Builder > Filtering by Associated Data
  • 关于Cakephp 3 NOT IN查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33353433/

    10-09 00:02
    查看更多