查找具有多个关联HABTM类型的一种类型的记录

时间:2012-12-28 16:47:36

标签: cakephp model cakephp-2.0 model-associations

我的CakePHP应用程序中有两个模型:NewsArticleImageImage与使用HABTM(拥有并且属于许多)关联的NewsArticle相关联,因此作者可以根据需要为文章建立图库。

在我的应用程序主页上,我想显示头条新闻,它只是最新发表的文章,至少有一个相关图像。我如何在我的控制器中形成这种情况?到目前为止,我有:

<?php
$topStory = $this->NewsArticle->find('first', array(
    'order' => array(
        'NewsArticle.created' => 'desc'
    )
));

但我不确定如何“计算”附加到Image模型的NewsArticle条记录的数量。

2 个答案:

答案 0 :(得分:0)

如果您必须使用HABTM,则需要进行加入(请参阅CakePHP Joins)。

原因是,普通的find()实际上会进行单独的查询,然后CakePHP会在将数据返回给您之前将数据放在一起。如果您试图通过子结果的存在来限制主要结果,则需要使用JOIN。

如果您能够使用HasMany(意味着ImagebelongTo一个NewsArticle),则可以使用CakePHP's counterCache

答案 1 :(得分:0)

为HABTM连接表创建CakePHP模型通常是明智的,然后您可以查询该表。

NewsArticle将有一个名为news_articles的表。图像将有一个名为images的表。所以联接表可能是news_articles_images。

我建议您使用与连接表不同的别名创建模型。防止出现问题。所以你可以这样做。

class Gallery extends AppModel
{
     var $name = 'Gallery';
     var $useTable = 'news_articles_images';
     var $belongsTo = array('NewsArticle','Image');
}

然后在您的控制器中,您可以轻松找到包含图像的第一篇文章。

$topStory = $this->Gallery->find('first',array('order'=>array('NewsArticle.created'=>'DESC'));