AND / OR conditions cakephp FIND for has many association

跟風遠走 提交于 2019-12-11 04:16:15

问题


I have a model Post that has many association with the model Comment.

Post has a primary key post_id which is Comment s foreign key.

Both of these have a visible column.

I have a working query on Post.visible options, and I need to add the AND to find all Posts that have one of Post.visible values.

For these posts I need all Comments that have a Comment.visible value = 1.

My code:

$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
        ));

The result without the AND is OK (but I get also the Comments with visible = 0).

When I put the condition "Comment.visible" => 1 in the has manyassociation, it works well (but I can not do this, because I need to get the Comment with visibility 0 elsewhere).

With the and it shows this Error:

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Comment.visible' in 'where clause'

When I dump the SQL, the comments table is not even matched in the SELECT clause (nor in the LEFT JOIN).


回答1:


You can limit another model's results using CakePHP's Containable Behavior with something like this (this should work, but feel free to tweak per your needs):

//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;
}

Or, you can set up your association to only ever pull comments that are visible (even WITH this way, I still recommend using 'contain' like above - you just wouldn't need to specify the condition each time):

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


来源:https://stackoverflow.com/questions/13563435/and-or-conditions-cakephp-find-for-has-many-association

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!