加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

Cakephp 3不在查询中

发布时间:2020-12-13 18:21:10 所属栏目:PHP教程 来源:网络整理
导读:我认为这是一种常见的模式,但我找不到优雅的Cake PHP方式.我们的想法是从列表中删除已经选择的值.要使用Cake书中的示例: table Students (id int,name varchar)table Courses (id int,name varchar)table CoursesMemberships (id int,student_id int,course
我认为这是一种常见的模式,但我找不到优雅的Cake PHP方式.我们的想法是从列表中删除已经选择的值.要使用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)

我想要做的就是创建一个查询,返回给定学生尚未注册的课程,最有可能填充选择下拉列表.

如果我没有使用Cake,我会做类似的事情

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 (CakeORMQuery $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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读