和/或条件cakephp FIND有很多关联

时间:2012-11-26 10:57:41

标签: cakephp cakephp-2.1

我有一个模型Post与模型Comment有许多关联。

Post有一个主键post_id,它是Comment的外键。

这两个都有一个可见的列。

我对Post.visible选项有一个有效的查询,我需要添加AND来查找具有Post.visible值之一的所有帖子。

对于这些帖子,我需要所有具有Comment.visible值= 1的评论。

我的代码:

$conditions = array(
                    "OR" => array(
                        "Post.visible" => array(
                            1,
                            2,
                            3,
                            4
                        ),
                    ),
                    "AND" => array (
                        "Comment.visible" => 1
                    )
                );

$result = $this->Post->find('all', array(
                'order' => 'Post.created DESC',
                'conditions' => $conditions
        ));

没有AND的结果是正常的(但我也得到了带有visible = 0的注释)。

当我把条件“Comment.visible”=> 1中有很多关联,它运作良好(但我不能这样做,因为我需要在其他地方获得可见性0的评论)。

使用和它显示此错误:

错误:SQLSTATE [42S22]:找不到列:1054'where子句'中的未知列'Comment.visible'

当我转储SQL时,SELECT子句中的注释表甚至不匹配(也不在LEFT JOIN中)。

1 个答案:

答案 0 :(得分:3)

您可以使用CakePHP's Containable Behavior使用类似的内容限制其他模型的结果(这应该有用,但可以根据您的需要进行调整):

//Post model
public $recursive = -1;

public $actsAs = array('Containable');

public function getPosts() {
    $posts = $this->find('all',
        array(
            'conditions' => array(
                'Post.visible' => 1
            ),
            'contain' => array(
                'Comment' => array(
                    'conditions' => array('Comment.visible' => 1)
                )
            )
        )
    );
    return $posts;
}

或者,您可以将关联设置为仅comments visible {即使这样,我仍然建议使用'包含'如上所述 - 您只需不需要每次都指定条件:

//Post model
public $hasMany = array(
    'Comment' => array(
        'conditions' => array('Comment.visible' => 1)
    )
);