2010-09-17 5 views
1

Je construis une application de revue de livre.Pouvez-vous inclure deux modèles dans une requête dans CakePHP?

Dans le modèle Review, j'ai book_id et plusieurs champs comme author_rating et/ou scary_rating. Dans le modèle Book, j'ai une fonction search() que je voudrais utiliser pour rechercher des livres avec certaines caractéristiques, comme un author_rating de plus de 5, par exemple.

Quelle est la meilleure façon d'y parvenir? Je sais que ceux-ci sont probablement faux, mais je pourrais ajouter les attributs (author_rating, scary_rating, etc) dans le modèle de livre et les mettre à jour (en moyenne) chaque fois qu'une revue est soumise; ou, je pourrais exécuter une tâche cron qui met à jour ces champs de temps en temps.

Mais y a-t-il un meilleur moyen de demander aux modèles Book et Review de trouver des livres et de répondre à certains critères définis en consultant la base de données Reviews?

Est-ce que cela a du sens?

Répondre

0

Il semble que vous avez un tas de commentaires et que vous voulez faire la moyenne à la volée quand quelqu'un cherche, est-ce correct? Si tel est le cas, je pense qu'il serait probablement préférable de sauvegarder les évaluations moyennées en tant que champs dans le modèle Book.

La raison pour laquelle je dis cela est qu'il est probable que votre application fera plus de recherches que de sauvegardes d'avis, et il est probablement plus important d'avoir des recherches renvoyées rapidement que les avis enregistrés rapidement. Cependant, si vous voulez calculer ces moyennes à la volée, vous pouvez utiliser la fonction AVG() de MySQL. Vérifiez ce poste SO pour un exemple que je pense est assez proche de votre situation:

MySQL - Can I combine these 2 SQL statements? Combine JOIN and AVG?

De plus, cela est une situation où je serais probablement écrire le SQL et le coller dans un query(), plutôt que en essayant de lutter avec la syntaxe ORM Cake:

http://book.cakephp.org/view/456/query

+0

Oui, j'ai fini par arriver à la même conclusion avec les champs de moyenne dans le modèle Book. Je cherchais simplement comment faire cela en utilisant l'ORM de CakePHP, mais il semble inutilement complexe, alors je pense que je vais suivre votre conseil et le mettre dans une requête. Le problème est que ce ne sont pas des moyennes simples ...ils doivent prendre en compte le nombre d'évaluations précédentes pour ne pas atteindre la moyenne de "50%", donc j'ai configuré counterCache et utilisé cela pour remplir un champ review_count dans le modèle Book que je vais utiliser pour calculer. – Justin

+0

Cela semble être une bonne approche ... bonne chance! – bjudson

1
you could use union, to combine two queries!!! 

query 1...... 

union 

query 2..... 

order by ratings LIMIT 1 

dans ce type de format, si vous voulez par exemple la vie réelle, alors im prêt à vous donner un,

SELECT 
       u.username, u.picture,m.id, m.user_note, m.reply_id, m.reply_name, m.dt 
       FROM 
       relationships r, 
       notes m, 
       user u 
       WHERE 
       m.user_id = r.leader 
       AND 
       r.leader = u.user_id 
       AND 
       r.listener = '$user_id' 
      UNION 
       select username, picture,id, user_note, reply_id, reply_name, dt 
       from user u, notes b 
       where u.user_id = b.user_id 
       and 
       b.user_id ='$user_id' 
       ORDER BY dt DESC LIMIT 10"; 
+0

donc en gros, vous pouvez avoir cette cette requête construite en un seul modèle !!! donc votre traitant de côté de la base de données plutôt que l'application, si vous obtenez ce que je veux dire! 1 :)) – getaway

+0

Merci beaucoup pour l'aide! Je vais chercher dans la documentation de CakePHP pour voir si cela est supporté par des helpers. – Justin

+0

plaisir, à tout moment! :)) – getaway

Questions connexes