2012-12-28 73 views
0

我的CakePHP應用程序中有兩個模型:NewsArticleImageImageNewsArticle使用HABTM(擁有和屬於許多)關聯關聯,所以作者可以爲他們的文章建立一個畫廊。查找一個類型與多個關聯的HABTM類型的記錄

在我的應用程序的主頁上,我想顯示最新的故事,這將只是最新發布的文章,至少有一個關聯圖片。我將如何在我的控制器中形成這種情況?到目前爲止,我有:

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

但我不確定如何「算」的Image記錄附在我NewsArticle模型的數量。

回答

0

如果您必須使用HABTM,則需要執行JOIN(請參閱CakePHP Joins)。

原因是,正常的find()實際上是做單獨的查詢,然後CakePHP在將數據返回給您之前將數據放在一起。如果您試圖通過子結果的存在限制主要結果,則需要使用JOIN。

如果您可以用HasMany代替(意思是ImagebelongTo a NewsArticle),則可以使用CakePHP's counterCache

+0

謝謝。如果我想在未來爲作者引入一個圖像庫,那麼我可能就不會在'多個文章中使用'圖像的情況下逃避'hasMany'關係。 –

+0

幫助如果我RTFM!閱讀CakePHP Cookbook中關於連接的部分,並最終到達此解決方案:https://gist.github.com/4401761。謝謝你指點我加入。 –

0

爲HABTM連接表創建CakePHP模型通常是明智的,那麼您可以查詢該表。

NewsArticle將有一個名爲news_articles的表。圖像會有一個名爲圖像的表格。所以連接表可能是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')); 
+0

您提到創建一個實際上是連接別名的新模型。 CakePHP是否會在內部創建一個「橋樑」模型?如果可以,我是否可以實際查詢*那個僞模型而不是創建自己的模型? –

+0

@MartinBean是的,它確實在內部創建一個。它的名稱將是連接表的名稱,但它不會有任何$ belongsTo關聯配置。此外,我不建議創建一個與此內部名稱相同的Model.php文件。蛋糕不會總是使用你創建的。 – cgTag

+0

獲取內部模型的一個實例 - CakeRegistry :: init('NewsArticlesImages');或基於連接表名稱的東西。 – cgTag

相關問題