2012-02-16 3 views
5

Dans ma base de données j'ai 5 tables:Yii relations multiples

    jeu
  • (game_id, nom, ...)
  • tag
  • (tag_id, nom, ...)
  • collection (coll_id, nom, ...)
  • collections_tags (id, coll_id, tag_id)
  • game_tag (id, game_id, tag_id)

Chaque jeu a beaucoup tags, la collection a de nombreux tags. Si je prends une collection, je peux trouver ses jeux en utilisant les tags de la collection.

Je suis en train de réaliser cette tâche avec les relations YII:

//in Collection's relations: 
'tags'=>array(self::MANY_MANY, 'Tag', 'collections_tags(coll_id,tag_id)'), 
'games'=>array(self::HAS_MANY, 'Game','tag_id', 'through'=>'tags') 

Puis-je obtenir une collection de $ et essayez ceci:

echo "collection ".$collection->name.": (id=".$collection->coll_id.") has ".count($collection->tags)."tags\n"; 
echo count($coll->games);//error here 

et obtenir une erreur
Quel est le problème dans les relations?

Répondre

6

Comme vous pouvez le voir ici: http://www.yiiframework.com/doc/guide/1.1/en/database.arr#relational-query-with-through, la déclaration correcte de cette relation serait la suivante:

'games'=>array(self::HAS_MANY, 'Game', array('tag_id'=>'id'), 'through'=>'tags') 
+0

Dans l'exemple que vous me avez donné (à yiiframework.com) ils utilisent le modèle « rôle ». Est-il nécessaire d'utiliser le modèle collections_tags dans mon cas? Ou il y a une solution de contournement sans craindre une nouvelle classe? – lvil

+0

Ce n'est peut-être pas nécessaire, mais s'il y a un moyen, ce serait plutôt difficile et il faudrait creuser le code AR du framework. Vous pouvez trouver le "principe" suivant dans la documentation: "Avant d'utiliser AR pour effectuer une requête relationnelle, nous devons indiquer à AR comment une classe AR est liée à une autre". Donc AR travaille avec des modèles. C'est comme ça. –