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:
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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']);
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 pourtant, on peut effectuer la même action avec une seule requête SQL:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5SELECT 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;
Merci d'avance pour votre participation.
Partager