Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > ORM > Doctrine
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/06/2011, 10h48   #1
Invité de passage
 
Inscription : mars 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 14
Points : 3
Points : 3
Par défaut [Doctrine] SELECT imbriqué

Bonjour à tous,

J'ai une requête qui me pose problème dans un projet de site web.
J'ai une table produit et une table test. Sur chaque produits peuvent être effectués plusieurs tests et ces tests possèdent un champ num_test qui indique si le test est le premier, deuxième, ... ou n-ème test effectué sur le produit.
Je souhaite récupérer avec une requête tous les derniers tests effectués sur tous les produits. Pour ce faire j'utilisais jusqu'à présent la requête suivant :
Code :
1
2
3
4
 
SELECT t.* FROM test t 
WHERE t.num_test =
           (SELECT MAX(num_test) FROM test WHERE product_id = t.product_id)
Le problème de cette requête est que lorsque le nombre de test sur un produit était trop important (au dela du millier de tests), cette dernière devenait beaucoup trop longue à s’exécuter à cause de la clause :
Code :
WHERE product_id = t.product_id
J'ai donc pensé à utiliser cette nouvelle requête qui semble s'éxecuter plus rapidement :
Code :
1
2
3
 
SELECT t.* FROM (SELECT * FROM test order by num_test desc ) t 
GROUP BY product_id
mais je ne sais pas comment traduire ce SELECT imbriqué sous Doctrine.

Je voulais donc savoir comment écrire cela sous Doctrine et si il y a une meilleur solution pour réaliser ce genre de requête.

Merci d'avance
Choucwoot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 12h31   #2
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Vu que, dans doctrine, la clause ->from() doit porter sur un objet du modèle, il ne sera jamais possible d'y intégrer ta requête.

Il doit être possible de ce servir de Doctrine pour simplement exécuter une requête, sans la toucher, style pdo et de récupérer juste un array avec les données.

Par contre, je ne vois pas trop l'intérêt de l'imbrication des requêtes, un truc du genre :
Code :
SELECT DISTINCT t.data1, t.data2... FROM test t ORDER BY num_test desc
ne serait-il pas plus court ?
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2011, 17h26   #3
Invité de passage
 
Inscription : mars 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 14
Points : 3
Points : 3
Je souhaite récupéré la ligne entière et non pas seulement les champs distinct(product_id) donc la requête que tu proposes ne fonctionne pas malheuresement. Je crois que je vais me résoudre à utiliser une requête pdo même si ça me chagrine un peu car cette doctrine_query me servait à alimenter un objet sfPager de symfony.
Choucwoot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 17h08   #4
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Tu ne peux pas faire tourner un Doctrine sur une table qui ne fait pas partie du modèle.

Il reste une solution (pas propre... quoique). Créer un objet du modèle indépendant qui correspond au résultat que tu souhaites et l’appuyer sur une requête enregistrée sur le serveur qui te retourne tes données.

Ceci me semble un rien bancal et est à approfondir.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h10.


 
 
 
 
Partenaires

Hébergement Web