在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')
));
如何修改此设置,以便接收包含文章的所有项目?
答案 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