2009-08-27 30 views
0

我有一個簡單的cakephp應用程序與表articles有一個cat_id列引用cats表中的id列的類別。使用CakePHP計算類別內的文章數量?

我想要做的是顯示所有類別名稱,每個名稱後面跟着屬於該類別的文章數量。

我知道cakephp中有一個find('count')函數,但只適用於一個表/字段。如何鏈接這兩個表格以獲取我的視圖中每個類別的類別名稱和文章數列表?

感謝

回答

2

它可能是更好地做到這在模型上的一個afterFind回調,但可以在控制器藏漢來完成。

$cats - $this->Cat->find('all',array('recursive'=>-1)); 
foreach($cats as $key=>$cat){ 
    $cats[$key]['ArticleCount'] = $this->Cat->Article->find('count',array(
    'conditions'=>array('Article.cat_id'=>$cat['Cat']['id'])) 
); 
} 

或看到,如果這個工程

$cats = $this->Cat->find('all',array('contain'=>array(
      'Article'=>array('fields'=>array('COUNT(*) AS ArticleCount') 
     ))); 

很明顯,你將需要添加的類別模型中可容納的行爲。

0

謝謝,這工作:

 $cats = $this->Article->Cat->find('all',array('recursive'=>-1)); 
    foreach($cats as $key=>$cat){ 
     $cats[$key]['ArticleCount'] = $this->Article->find('count',array(
     'conditions'=>array('Article.cat_id'=>$cat['Cat']['id'])) 
    ); 
    } 
+0

這可能適用,但我認爲有更好的辦法。你應該使用Set :: combine函數而不是foreach。這樣的事情我認爲更有效率: $ category_count = $ this-> Article-> find('all',array( 'fields'=> array('Category.name','COUNT(Article.id) AS num_articles'), 'group'=>'Category.id', 'conditions'=> $ conditions )); $ category_count = Set :: combine($ category_count,'{n} .Category.name','{n} .0.num_articles'); 這假定您的模型關係設置正確。 – jimiyash 2009-08-29 00:20:19

+0

這是有效的,但對於dhofstet的觀點來說,您正在以CounterCache的形式複製已存在於模型中的代碼。 – 2009-09-09 11:53:41

2

您也可以考慮檢查出counterCache一列值內緩存的數量。

4

COme on!使用counterCache! 在表格「貓」中創建字段article_count。在型號中寫

/app/models/cat.php 
class Cat extends AppModel 
{ 
    var $name = 'Cat'; 
    var $belongsTo = array('Article'=>array('counterCache'=>true)); 
} 

就這樣!每次你從文章中添加/刪除,它會寫入文章的貓表計數。 不要忘記包括article_count到字段列表