2010-10-22 14 views
0

J'ai deux modèles dans cakephp, Link et Vote.Somme d'un champ avec hasMany dans cakephp

Je veux avoir la somme des votes pour chaque lien dans mon modèle de lien. Voici une copie de ma fonction findAll:

[1] => Array 
    (
     [Link] => Array 
      (
       [id] => 1 
       [url] => http://www.google.com 
       [date_added] => 2010-08-19 11:36:56 
       [valid] => 1 
      ) 

     [Vote] => Array 
      (
       [0] => Array 
        (
         [link_id] => 1 
         [user_id] => 0 
         [vote] => 3 
        ) 

       [1] => Array 
        (
         [link_id] => 1 
         [user_id] => 4 
         [vote] => 4 
        ) 

      ) 

    ) 

Ce que je voudrais avoir est cette (notez les votes attribut):

[1] => Array 
    (
     [Link] => Array 
      (
       [id] => 1 
       [url] => http://www.google.com 
       [date_added] => 2010-08-19 11:36:56 
       [valid] => 1 
       [votes] => 7 
      ) 

     [Vote] => Array 
      (
       [0] => Array 
        (
         [link_id] => 1 
         [user_id] => 0 
         [vote] => 3 
        ) 

       [1] => Array 
        (
         [link_id] => 1 
         [user_id] => 4 
         [vote] => 4 
        ) 

      ) 

    ) 

Mais je ne sais pas où je suis censé faites la somme des votes.

+1

Qu'avez-vous essayé? Qu'est-ce qui n'a pas fonctionné? On s'attend à ce que vous fassiez des efforts avant de poser une question. –

+1

Eh bien, ce n'est pas un très bon commentaire! – kevin

Répondre

0

Vous pouvez créer un champ virtuel "votes" dans votre modèle de lien. http://book.cakephp.org/view/1608/Virtual-fields

var $virtualFields = array( 
    'votes' => 'COUNT ...' 
); 
+0

Oui, j'ai essayé d'utiliser un champ virtuel dans mon modèle de lien, mais je ne pouvais pas le faire fonctionner sans une requête SQL complète. – kevin

+0

Et quel est le problème avec ça? –

+0

Il me semble un peu «sale», j'espérais pouvoir les résumer sans l'utilisation de SQL, je voulais faire abstraction de cette opération pour qu'elle ne dépende pas d'un système de gestion de base de données. – kevin

0

Essayez d'utiliser CakePHP counterCache Sum of a field with hasMany in cakephp

1) Ajouter un nouveau champ à la table des 'liens' - links.vote_count

2)

<?php class Vote extends AppModel { 
     var $belongsTo = array(  
       'Link' => array('counterCache' => true)  
     );} 
?> 

3) A partir de maintenant Sur, chaque fois que vous ajoutez ou supprimez un Vote associé à Lien, le nombre dans Vote_count est ajusté automatiquement.

0

Je sais que c'est un sujet à partir de 2010, mais j'avais beaucoup de problèmes avec ceci et c'est le premier résultat de Google.

Une autre option consiste à utiliser afterFind dans le modèle de lien parent, comme ceci:

public function afterFind($results, $primary = false) { 

    if(($this->findQueryType=='count') || $primary == false) return $results; 

    foreach ($results as $key => $val) { 
     if(isset($val['Vote'])) { 
      $votes = Hash::extract($val, 'Vote.{n}.vote'); 
      $results[$key]['Link']['votes'] = array_sum($votes); 
     } 
    } 

    return $results; 
} 

Maintenant, chaque fois que vous faites une découverte() sur Link qui revient également l'objet de vote (par exemple lorsque vous appelez trouver en utilisant 'Contenir'), votre objet Lien contiendra la somme des votes.