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 : 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']);
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
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 : 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
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
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.