2009-09-17 4 views
0

J'ai dans un projet de site de partage vidéo ces modèles:counterCache de CakePHP

class Video extends AppModel { 
     var $name = 'Video'; 
     var $hasAndBelongsToMany = array(
      'Tag' => array(
       'className' => 'Tag', 
       'joinTable' => 'videos_tags', 
       'foreignKey' => 'video_id', 
       'associationForeignKey' => 'tag_id', 
       'unique' => true, 
      ) 
     ); 
    } 

    class Tag extends AppModel { 
     var $name = 'Tag'; 

     var $hasAndBelongsToMany = array(
      'Video' => array(
       'className' => 'Video', 
       'joinTable' => 'videos_tags', 
       'foreignKey' => 'tag_id', 
       'associationForeignKey' => 'video_id', 
       'unique' => true, 
      ) 
     ); 

    } 



class VideosTag extends AppModel { 
     var $name = 'VideosTag'; 

     var $belongsTo = array(
      'Video' => array(
       'className' => 'Video', 
       'foreignKey' => 'video_id', 
      ), 
      'Tag' => array(
       'className' => 'Tag', 
       'foreignKey' => 'tag_id', 
       'conditions' => '', 
       'counterCache' => 'videos_tag_counter' 
      ) 
     ); 
    } 

Le counterCache pour les balises ne fonctionne pas. Je ne sais pas pourquoi et quand j'ai essayé d'ajouter un rappel beforeSave() au modèle videosTag, j'ai trouvé qu'il ne s'exécute pas quand une vidéo est enregistrée (et cette vidéo a des tags et je les trouve dans la base de données videosTags est enregistré?) !!! Quelqu'un peut-il expliquer pourquoi cela se produit?

+0

Comment vous enregistrez les données? Les modèles 'videosTag'' beforeSave' ne seraient déclenchés que si vous enregistrez l'enregistrement en utilisant le modèle 'VideosTag', mais probablement pas via' $ this-> Tag-> saveAll'. – deceze

+0

Je ne sais pas comment cela est sauvegardé parce que cakePHP a généré tout et parce que le modèle vidéo a une relation HABTM avec les tags, les videosTags sont enregistrées. – Ayoub

Répondre

2

Enregistrement d'une vidéo avec des données comme ceci:

array(
    'Video' => array(
    ... 
), 
    'Tag' => array(
    'Tag' => array(
     ... 
    ), 
), 
); 

sur le modèle de la vidéo ne déclenche pas un rappel beforeSave sur le modèle VideosTag car gère gâteau données HABTM sans exiger (ou même en utilisant) la jointure/avec/à travers le modèle.

Il n'existe pas de fonctionnalité intégrée pour ce que vous essayez d'atteindre, à ma connaissance.

Check out Counter Cache behavior for HABTM relations, pourrait faire ce que vous avez besoin