如何在 CakePHP 3.0 中复制 Query::notMatching()?

Posted

技术标签:

【中文标题】如何在 CakePHP 3.0 中复制 Query::notMatching()?【英文标题】:How to replicate Query::notMatching() in CakePHP 3.0? 【发布时间】:2015-08-06 19:21:52 【问题描述】:

我不喜欢使用 cakephp 3.1 beta。我使用的是 3.0 版。我正在尝试查找所有没有特定标签的帖子。我该怎么做?

【问题讨论】:

如果你问如何找到特定的 Stack Overflow 帖子,这是 Stack Overflow Meta 的问题。 @m69 我在问如何在 cakephp 项目中找到帖子 然后我误读了这个问题。请忽略。 【参考方案1】:

为了复制notMatching() 的行为,您必须添加一个适当的LEFT 连接以匹配应排除的标签,另一个LEFT 连接以包含连接表,然后在主查询中使用条件,通过IS NULL 检查连接表的主键,排除具有匹配标签的行。

这是一个基本示例,假设是 Posts belongsToMany Tags 关系

$query = $Posts
    ->find()
    ->leftJoin(
        ['Tags' => 'tags'],
        ['Tags.title' => 'specificTagToExlcude']
    )
    ->leftJoin(
        ['PostsTags' => 'posts_tags'],
        'Posts.id = PostsTags.post_id AND Tags.id = PostsTags.tag_id'
    )
    ->where([
        'PostsTags.id IS NULL'
    ]);

这将创建一个类似于

的查询
SELECT
    Posts.id AS `Posts__id`,
    // ...
FROM
    posts Posts 
LEFT JOIN
    tags Tags 
        ON Tags.title = 'specificTagToExlcude' 
LEFT JOIN
    posts_tags PostsTags
        ON PostsTags.post_id = Posts.id 
        AND PostsTags.tag_id = Tags.id 
WHERE
    PostsTags.id IS NULL

【讨论】:

以上是关于如何在 CakePHP 3.0 中复制 Query::notMatching()?的主要内容,如果未能解决你的问题,请参考以下文章

如何修改CakePHP的连接条件

如何防止 CakePHP 3.0 中的多个表单提交?

CakePHP回调函数如何知道$ q是一个Query对象,哪个表执行查询?

Cakephp 3:如何忽略特定查询的先行查找?

如何在 cakephp 中使用事务?

CakePHP 3.0 中虚拟字段/实体属性上的分页排序链接