2009-11-04 23 views
0

Ce que j'essaye de faire est de tirer l'information de profil w/les commentaires du profil. Je reçois tout comme prévu. Aucune erreur renvoyée, le tableau est parfaitement formaté. Ma préoccupation est les requêtes qui sont exécutées. Il lance une requête pour chaque identifiant pour obtenir sa photo (le début de la requête est noté dans les commentaires dans le code ci-dessous). Je suppose que c'est le seul moyen d'obtenir des photos par user_id? Tout dans des requêtes séparées? Y a-t-il un meilleur moyen?Beaucoup de requêtes pour afficher les photos des utilisateurs et leurs commentaires. (CakePHP)

J'imagine un profil avec plus de 40 commentaires et c'est effrayant d'imaginer. Est-ce là où Memcached entre?

$profile = $this->Profile->find('first', array(
          'conditions' => array('Profile.url' => $url), 
          'contain' => array(
            'User' => array(
              'fields' => array(
                'User.id','User.name' 
              ), 
              'Photo' => array(
                'fields' => array(
                  'Photo.thumbnail','Photo.image' 
                ) 
              ) 
            ), 
            'Comment' => array(
         'User' => array(
          'fields' => array(
           'User.name' 
          ), 
          'Photo' => array(// right here 
           'fields' => array(
            'Photo.thumbnail' 
           ) 
          ) 
         ) 
        ) 
          ) 
        )); 

modifier:

J'ai évidemment une table utilisateur, ainsi qu'une table de commentaire. J'ai aussi une table Photo qui stocke les URL des images des utilisateurs, clé étrangère = user_id. Donc, pendant que j'interroge tous les commentaires d'un profil spécifique et que c'est Comment.user_id, j'ai aussi besoin de récupérer le Photo.thumbnail de la table Photo par son user_id.

Répondre

1

Vous pouvez le faire beaucoup plus rapidement en utilisant un LEFT JOIN. Le code a été modifié pour mieux répondre à la question (deux jointures à gauche sont nécessaires - pas une).

SELECT c.text, i.profiles, p.photo_url 
FROM comments AS c 
LEFT JOIN profiles AS i on c.profile_id = i.id 
LEFT JOIN photos AS p ON i.id = p.user_id 
WHERE c.post_id = 32 
LIMIT 20 

Ceci est juste un SQL générique, mais serait:

  1. tirer tous les commentaires (dans le tableau des commentaires) beuglant à l'article 32
  2. gauche se joindre à la table des profils correspondant à l'affiche de commentaires id à la commenter
  3. tirer les 20 premiers commentaires

Et avec une seule requête que vous tirez toutes les 30 com ments + leurs profils associés.

J'espère que ça aide!

+0

Salut, Frankie merci de répondre. Je pense que je dois expliquer ma situation plus clairement. J'ai évidemment une table User, ainsi qu'une table Comment. J'ai aussi une table Photo qui stocke les URL des images des utilisateurs, clé étrangère = user_id. Donc pendant que j'interroge tous les commentaires d'un "article" spécifique comme vous le dites, j'ai aussi besoin de saisir le Photo.thumbnail de la table Photo par son user_id. Désolé pour la confusion, je vais éditer mon post original pour le rendre plus clair pour les autres. – cp3

+0

Pas de problème! Faites-en deux JOINS GAUCHE! Je vais modifier l'exemple. – Frankie

+0

Génial! Merci! Encore une chose. ive édité la requête un peu pour mon application mais quand je demande pour les commentaires im essayant également d'obtenir le nom d'utilisateur alors j'ai essayé: SELECT c.content, c.created, c.modified, p.thumbnail, u.name FROM comments AS c Profils LEFT JOIN AS i ON c.profile_id = i.id GAUCHER JOIN les photos AS p ON i.id = p.user_id UTILISATEURS DE GAUCHE JOINTS p.user_id = u.id O WH c.profile_id = 1 mais il montre le même nom et peut-être le même p.thumbnail. Merci beaucoup pour votre aide. – cp3

1

Vous pouvez remplacer la clé de tableau 'contain' par la clé de tableau 'link', et elle crée les jointures de gauche pour vous - voir linkable behavior. L'inconvénient est que toutes les relations liées doivent être de la relation hasOne ou hasMany à l'appartenance.

+0

J'ai trouvé le comportement Linkable plus tôt aujourd'hui. Je ne peux pas le faire fonctionner comme je le veux. C'est bien d'arranger les tables à une relation directe. Mais une fois qu'il commence à aller au-delà du niveau 1 récursif, il craps et je n'obtiens aucun résultat. Peut-être que je fais quelque chose de mal. Été à ceci pendant des jours essayant de l'obtenir juste avant que je continue parce que ce type de requête est semblable aux autres requêtes que je courrai dans cette application Web. Frustrant!! – cp3

Questions connexes