[Doctrine] fait une requête SQL de trop avec deux innerJoin()
Bonsoir,
Dans mon projet actuel j'utilise Symfony avec Doctrine. Ceci est une première expérience avec ce framework. Jusqu'alors je travaillais avec Zend. Tout se passe bien jusqu'ici. Enfin, presque.
La situation qui me fait mal à la tête est la suivante. J'ai trois tables:
- messages (avec deux clés étrangères: users_id_us - id du récepteur et messages_content_id_mc - id du contenu de message)
- messages_content (avec une clé étrangère : users_id_us - id de l'auteur du message)
- users - (sans clés étrangères, la clé primaire : id_us).
Maintenant je cherche à récupérer tous les messages pour un utilisateur connecté. La mission partiellement réussie. Je m'explique.
La requête Doctrine que j'utilise pour cette tâche est la suivante:
Code:
1 2 3 4 5 6 7 8 9
| $q = Doctrine_Query::create()
->select('id_me, users_id_us, state_me, type_me, mc.title_mc, us.login_us')
->from('messages m')
->innerJoin('m.messages_content mc')
->innerJoin('mc.Users us')
->where('users_id_us = ?', $user)
->limit($opt['limit'])
->offset($opt['offset'])
->orderBy($opt['order']); |
Tout se passe bien: j'ai tous les éléments qu'il faut, sauf... Sauf que Doctrine crée deux requêtes SQL au lieu d'une:
Code:
1 2 3 4 5
| SELECT DISTINCT m3.id_me FROM messages m3
INNER JOIN messages_content m4 ON m3.messages_content_id_mc = m4.id_mc
INNER JOIN users u2 ON m4.users_id_us = u2.id_us
WHERE m3.users_id_us = '6'
ORDER BY m3.id_me DESC LIMIT 2 |
et
Code:
1 2 3 4 5 6
| SELECT m.id_me AS m__id_me, m.users_id_us AS m__users_id_us, m.state_me AS m__state_me, m.type_me AS m__type_me, m2.id_mc AS m2__id_mc, m2.title_mc AS m2__title_mc, u.id_us AS u__id_us, u.login_us AS u__login_us
FROM messages m
INNER JOIN messages_content m2 ON m.messages_content_id_mc = m2.id_mc
INNER JOIN users u ON m2.users_id_us = u.id_us
WHERE m.id_me IN ('11') AND (m.users_id_us = '6')
ORDER BY m.id_me DESC |
Et pourtant, on peut effectuer la même action avec une seule requête SQL:
Code:
1 2 3 4 5
| SELECT m.id_me, m.users_id_us, m.state_me, m.type_me, mc.title_mc, u.login_us
FROM messages m
JOIN messages_content mc ON mc.id_mc = m.messages_content_id_mc
JOIN users u ON u.id_us = mc.users_id_us
WHERE m.users_id_us = 6; |
Avez-vous une idée quelconque pourquoi Doctrine crée deux requêtes tandis que logiquement on devrait en utiliser une ? Je cherche à le comprendre pour pouvoir modifier ma requête DQL. Cependant, je n'ai plus d'idées.
Merci d'avance pour votre participation.