Comment puis-je écrire une requête de jointure entre plusieurs tables dans CakePHP?
quelqu'un peut me dire, comment faire pour récupérer rejoint le résultat de plusieurs tables dans cakePHP ( en utilisant cakePHP architecture mvc). Par exemple, j'ai trois tables de jointure (tbl_topics, tbl_items, tbl_votes. Leur relation est définie comme suit: un sujet peut avoir de nombreux articles et un article peut avoir beaucoup de votes. Maintenant, je veux récupérer une liste de sujets, avec le décompte de toutes les voix de tous les éléments pour chaque sujet. La requête SQL pour ce qui est écrit ci-dessous:
SELECT Topic.*, count(Vote.id) voteCount
FROM
tbl_topics AS Topic
LEFT OUTER JOIN tbl_items AS Item
ON (Topic.id = Item.topic_id)
LEFT OUTER JOIN tbl_votes AS Vote
ON (Item.id = Vote.item_id);
Mon problème est que je peux le faire facilement en utilisant $this-><Model Name>->query
fonction, mais cela nécessite du code sql pour être écrit dans le contrôleur que je ne veux pas. J'essaie de trouver une autre façon de le faire (comme find()
).
OriginalL'auteur |
Vous devez vous connecter pour publier un commentaire.
visées à nate abele de l'article: texte du lien
je vais la tester pour mes tables ce soir...
Votre fonction recherche ne reçoit que des champs dans le Marqueur de table pas les deux autres tables.
Vous devez mentionner des champs dans un autre tableau électronique.g $this->Marqueur->find('all', array('rejoint' => array(.....), 'fields' => array(MarkersTag.marker_id,Marqueur.id));
OriginalL'auteur
Je vais être honnête et dire que vous aurez probablement être beaucoup plus heureux si vous venez de créer une fonction dans votre modèle, quelque chose comme getTopicVotes() et en appelant query (). Toutes les autres solutions, je pense, de ne faire plus compliqué et donc plus laide.
Edit:
En fonction de la taille de vos données, et en supposant que vous avez mis en place votre modèle de relations correctement (Rubrique hasMany Éléments hasMany Votes), vous pourriez faire un simple find('all') contenant tous les éléments et les votes, et puis faire quelque chose comme ceci:
Deux choses sont importantes ici:
OriginalL'auteur
Vous pouvez facilement définir le "récursive" propriété sur un find() de la requête.
Alternativement, vous pouvez utiliser le behavior Containable comportement de votre modèle. Ensuite, vous pouvez utiliser:
ou
contain
que vous avez décrite, et il ne fonctionne pas. Aussi, je vous déconseillons d'utiliserrecursive = 2
, parce que, si vous avez de nombreuses associations, vous encombrent votre application.Il y avait un bug dans mon exemple. Je l'ai corrigé. Veillez à ajouter le behavior Containable comportement pour le modèle!
OriginalL'auteur
Ce que vous avez besoin est récursive des associations de soutien, ce qui n'est pas possible avec le stock de CakePHP actuellement.
Bien qu'il pourrait être atteint en utilisant certains bindModel supercherie
ou expérimental RecursiveAssociationBehavior.
Ces deux solutions, soit vous obliger à utiliser un code supplémentaire ou de s'appuyer sur un comportement dans votre application, mais si vous résistez à la tentation d'écrire pur code SQL, vous serez récompensé avec le fait d'être en mesure d'utiliser de Cake à la pagination automatique conditions, le modèle de la magie etc..
OriginalL'auteur
Vous devriez étudier HaBTM (A et Appartient à Plusieurs)
http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html
Essayez d'utiliser d'Élément de classe extends AppModel { var $belongsTo = array('Rubrique') }
N'est-ce pas habtm pour les deux tables, où la question se pose au sujet de se joindre à trois?
Il n'est pas question de HABTM.
OriginalL'auteur