CakePHP find()条件用于关联条目

时间:2016-03-01 11:37:07

标签: php cakephp associations has-many

我有以下命令,从我的数据库中获取带有关联的hasMany条目的条目:

$teasers = $this->Teaser->find('all', array(
    'conditions' => array(
        'Teaser.published' => 1
    ),
));

由于posts关系,现在还会提取hasMany个条目。

输出如下:

array(
    0 => array(
        'Teaser' => array(
            'id' => '1',
            'user_id' => '63',
            'token' => '56d455bc20cfb56d455bc20d08',
            // this goes on
        ),
        'Post' => array(
            0 => array(
                'id' => '1',
                'teaser_id' => '1',
                'title' => 'blabla',
                'text' => 'blabla',
                'published' => 1,
                // this goes on
            )
        )
    )
)

现在我的问题是,如何在conditions中添加内容,以过滤Post - 条目?

当我这样输入时,我收到一个错误:

$teasers = $this->Teaser->find('all', array(
    'conditions' => array(
        'Teaser.published' => 1,
        'Post.published' => 1
    )
));

3 个答案:

答案 0 :(得分:1)

您应该阅读containableretrieving data的文档。这些是基础知识。

$teasers = $this->Teaser->find('all', array(
    'contain' => [
        'Post' => [
            'conditions' => [
                'published' => 1
            ]
        ]
    ],
    'conditions' => array(
        'Teaser.published' => 1,
    )
));

答案 1 :(得分:1)

您收到错误的原因是您的关系是hasMany,因此当Cake执行contain时,它实际上为您的find执行了多个查询。因此,您无法在条件中指定'Post.published' => 1,因为主查询中不存在Post别名(检索您的预告片的那个)。

相反,您需要将额外条件作为包含的一部分传递: -

$teasers = $this->Teaser->find('all', [
    'contain' => [
        'Post' => [
            'conditions' => [
                'Post.published' => 1
            ]
        ]
    ],
    'conditions' => [
        'Teaser.published' => 1,
    ]
]);

这将让Cake知道在为帖子构建查询时要使用的条件。

答案 2 :(得分:0)

您可以在模型Teaser.php中编写条件

public $hasMany = array(
    'Post' => array(
        'className' => 'Post',
        'conditions' => array('Post.published' => 1)
    )
);