CakePHP仅获得具有相关模型的结果

时间:2019-06-12 12:34:25

标签: cakephp cakephp-2.0

在CakePHP 2项目中,我的项目中有很多文章,一个文章可以属于许多项目(多对多关系)。

现在,我想找到所有包含文章的项目。 我当前用于获取项目的代码如下

$projects = $this->Project->find('list', array(
    'fields' => array('Project.slug', 'Project.name')
));

我试图将包含添加到查询中,但没有结果

$projects = $this->Project->find('list', array(
    'contain' => array('PressArticles' => array()),
    'fields' => array('Project.slug', 'Project.name')
));

如何修改此设置,以便接收包含文章的所有项目?

2 个答案:

答案 0 :(得分:0)

包含无济于事,非1:1关系将在单独的查询中检索,因此不会对您的主查询产生任何影响。

例如,您可以使用关联的join和target表手动创建INNER联接,这将自动过滤掉所有没有相关文章的项目,与此类似(我或多或少地猜到了名称,这只是一个快速而肮脏的示例):

$projects = $this->Project->find('list', array(
    'fields' => array('Project.slug', 'Project.name'),
    'joins' => array(
        array(
            'table' => 'press_articles_projects',
            'alias' => 'PressArticleProject',
            'type' => 'INNER',
            'conditions' => array(
                'PressArticleProject.project_id = Project.id',
            ),
        ),
        array(
            'table' => 'press_articles',
            'alias' => 'PressArticle',
            'type' => 'INNER',
            'conditions' => array(
                'PressArticle.id = PressArticleProject.press_article_id',
            ),
        )
    ),
    'group' => 'Project.id'
));

或者,如果您正在使用计数器缓存,则也可以选择通过计数器进行过滤:

$projects = $this->Project->find('list', array(
    'fields' => array('Project.slug', 'Project.name'),
    'conditions' => array(
        'Project.press_article_count >' => 0
    )
));

另请参见

答案 1 :(得分:0)

在您的Project模型中,您可以

public $hasMany = array(
        'PressArticle' => array(
            'className' => 'PressArticle',
            'foreignKey' => 'project_id'
        )
    );

有关更多信息,请检查here