2009-08-27 15 views
0

J'ai une simple application cakephp avec la table articles qui a une colonne cat_id pour référencer une colonne de catégories id dans un tableau cats.Compte le nombre d'articles dans une catégorie en utilisant CakePHP?

Ce que je voudrais faire est d'afficher tous les noms de catégories, chacune suivie d'un compte du nombre d'articles appartenant à cette catégorie.

Je sais qu'il existe une fonction find('count') dans cakephp, mais qui ne fonctionne que sur une table/champ. Comment puis-je lier les deux tables pour obtenir une liste de noms de catégories et le nombre d'articles pour chaque catégorie pour mon affichage?

Merci

Répondre

2

il pourrait être préférable de le faire dans le rappel afterFind sur le modèle, mais peut être fait dans le aswell contrôleur.

$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'])) 
); 
} 

ou voir si cela fonctionne

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

vous aurez évidemment besoin d'ajouter le comportement maîtrisable sur le modèle de la catégorie.

0

Merci, cela a fonctionné:

 $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

Cela fonctionne probablement, mais je pense qu'il y a un meilleur moyen. vous devriez utiliser la fonction Set :: combine au lieu de foreach. Quelque chose comme ce que je pense est plus efficace: $ category_count = $ this-> Article-> find ('all', tableau ( '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'); Cela suppose que vos relations de modèle sont correctement configurées. – jimiyash

+0

Cela fonctionne, mais au point de dhofstet vous dupliquez le code qui existe déjà dans le modèle sous la forme de CounterCache. –

2

Vous pouvez également envisager de vérifier counterCache pour mettre en cache le compte dans une valeur de colonne.

4

Suivez-moi! Utilisez counterCache! Dans la table "chats", créez le champ article_count. Dans Modèle écrire

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

C'est tout! Chaque fois que vous ajoutez/supprimez des articles, il écrit à la table des chats le nombre d'articles. ne pas oublier d'inclure article_count dans la liste des champs

Questions connexes