Cakephp 基于多个HABTM关系中的条件查找()

Cakephp 基于多个HABTM关系中的条件查找(),cakephp,cakephp-2.0,conditional-statements,has-and-belongs-to-many,multiple-conditions,Cakephp,Cakephp 2.0,Conditional Statements,Has And Belongs To Many,Multiple Conditions,我正在使用CakePHP2.1 让我们说明我有以下模型和关系: 属于第二版的帖子 张贴HABTM编辑 张贴HABTM标签 我从PostsController进行推理,我想找到属于某个版本的所有帖子,并且Editor.id=55是相关的,Tag.id=33是相关的 我发现了许多例子,其中基于HABTM关系的条件查找帖子是通过“反转”编辑器的查找方向和原因来完成的 不幸的是,这在这里不起作用,因为有多个HABTM关系,我想对它们设置一个条件 此外,使用contain也不起作用,因为它只会切断一个分支

我正在使用CakePHP2.1 让我们说明我有以下模型和关系: 属于第二版的帖子 张贴HABTM编辑 张贴HABTM标签

我从PostsController进行推理,我想找到属于某个版本的所有帖子,并且Editor.id=55是相关的,Tag.id=33是相关的

我发现了许多例子,其中基于HABTM关系的条件查找帖子是通过“反转”编辑器的查找方向和原因来完成的

不幸的是,这在这里不起作用,因为有多个HABTM关系,我想对它们设置一个条件

此外,使用contain也不起作用,因为它只会切断一个分支编辑器,但无助于过滤它的父帖子

我如何解决这个问题? 我是否需要求助于临时加入?如果是这样的话,有人能大致解释一下该采取什么方法吗

编辑: 一些伪代码来说明我想要实现的目标:

$this->Post->find('all',
    array('conditions'=>array(
            'Edition.id'=>4,
             // start pseudo code
            'Post.Editor' => 'has at least one related editor with id=55',
            'Post.Tag' => 'has at least one related tag with id=33',
        )
    )
);
亲切问候,, 巴特

编辑解决方案: 在@RichardAtHome之后,我创建了下面的解决方案。尚未采用多个联接条件,但似乎没有必要:

// Paginate over Cards that belong to current Subscription (belongsTo) AND the User is related to as an Editor (HABTM)
$this->paginate = array(
    'fields' => array('id','title','workingtitle','attachment_count','subscription_id'),
    'joins' => array(
        // create Editor-join
        array(
            'table' => 'cards_users',
            'alias' => 'Editor',
            'type' => 'left',
            'conditions' => array(
                'Editor.card_id = Card.id'
            )
        ), 
        array( 
            'table' => 'users', 
            'alias' => 'User', 
            'type' => 'left',
            'conditions'=> array( 
                'User.id = Editor.user_id'
            ) 
        )
    ),
    'conditions' => array(
        'OR' => array(
            // is Card in current subscription? (straightforward condition)
            array('Card.subscription_id',$subscription_id),
            // is current User assigned as Editor? (condition works with join above)
            array('User.id' => $user['id'])
        )
    ),
    'limit' => 10
);
尝试:


对于这种类型的查询,我通常发现自己构造连接最简单,因为cake不会连接,它将执行多个查询,而不是从表a中选择匹配的行,然后从表b中获取匹配的行

您的查询需要如下所示:

$this->Post->find('all',
    array(
        'conditions'=>array('Post.edition_id'=>4),
        'joins'=>array(
            array(
                'type'=>'inner',
                'table'=>'posts_editors',
                'alias'=>'PostsEditor',
                'conditions'=>array(
                    'PostsEditor.post_id = Post.id',
                    'PostsEditor.editor_id'=>55 // your criteia for editor id=55
                )
            ),
            array(
                'type'=>'inner',
                'table'='posts_tags',
                'alias'=>'PostsTag',
                'conditions'=>array(
                    'PostsTag.post_id = Post.id',
                    'PostsTag.tag_id'=>33 // your criteria for tag id = 33
                )

            )
        )
    )
);

检查输出的SQL以查看此查询在幕后实际执行的操作。

您真正想要的是什么?给出您想要的代码的大致数字。@arun jain我添加了一些伪代码,这是否足够清晰?仅尝试“Editor.id”条件我得到错误:错误:SQLSTATE[42S22]:找不到列:1054未知列“Editor.id”在“where”子句中“public$hasandbelongtomany=array'Editor'=>array'className'=>User',“joinTable”=>“cards\u users”、“foreignKey”=>“card\u id”、“associationForeignKey”=>“user\u id”、“unique”=>“keepExisting”、//只有属于当前订阅且具有“Editor”或“ChiefEditor”状态的用户才有资格获得“conditions”=>,“fields”=>,“order”=>,“limit”=>,“offset”=>,'finderQuery'=>,'deleteQuery'=>,'insertQuery'=>确定。然后在find$this->Post->recursive=1之前添加;这将如何解决找不到列的问题?充其量只能限制可用信息。谢谢,我已经添加了它。不幸的是,它没有成功。我将递归级别提高到了6级,这也没有什么不同。我怀疑我必须使用连接,下面的@richardathome似乎证实了这一点。我来试试他的方法。@RichardAtHome嘿,Richard,在加入时你似乎很在行。你能看看这个相当烦人,但我有类似的问题吗谢谢!
$this->Post->find('all',
        array('conditions'=>array(
                'Edition.id'=>4,
                'Editor.id' => '55',
                'Tag.id' => '33',
            )
        )
    );
$this->Post->find('all',
    array(
        'conditions'=>array('Post.edition_id'=>4),
        'joins'=>array(
            array(
                'type'=>'inner',
                'table'=>'posts_editors',
                'alias'=>'PostsEditor',
                'conditions'=>array(
                    'PostsEditor.post_id = Post.id',
                    'PostsEditor.editor_id'=>55 // your criteia for editor id=55
                )
            ),
            array(
                'type'=>'inner',
                'table'='posts_tags',
                'alias'=>'PostsTag',
                'conditions'=>array(
                    'PostsTag.post_id = Post.id',
                    'PostsTag.tag_id'=>33 // your criteria for tag id = 33
                )

            )
        )
    )
);