8768 sujets

Développement web côté serveur, CMS

Salut

J'utilise createNativeQuery() pour créer une requête sur mesure. Ma table sur laquelle je fais ma requête n'est pas une entité en soit, donc c'est pour cela que je passe par du sql natif et non l'entité direct via doctrine.

Du coup j'ai une requête sql que j'aimerais executer. voici l'exemple avec createNative :

 $query = $em->createNativeQuery("SELECT vs.[id_vol_stock], vs.[prix], vs.[Qte], v.[id_vol]  FROM [BASE1].[prefix].[TABLE1] as vs
                          INNER JOIN [BASE1].[prefix].[TABLE2] as v ON vs.[id_vol_stock] = v.[id_vol_stock] 
                          WHERE [AER_AD] = 'blabla' 
                          AND [AER_AA] = 'blabla' 
                          AND [AER_RD] = 'blabla' 
                          AND [AER_RA] = 'blabla'
                          AND [id_marque] = 'blabla'
                          AND v.[date_dep] = '02/11/2001'
                          AND v.[date_arr] = '03/11/2001'", $rsm);


rsm est bien le ResultSetMapping..
j'ai caché volontairement les bases + prefix + table, et également les blabla remplace les vraies valeurs.
Il faut savoir aussi que la requête, si je la prend tel quel et que je l'execute sur sql serveur, j'ai bien mes résultats ! j'ai 7 lignes, bien remplies...
par contre ici j'ai 7 arrays, mais vides.... tous...

malgré mon
 $d = $query->getResult(); 

donc quand je fais
var_dump($d);
j'ai ça en retour :
array(0) { } array(0) { } array(0) { } array(0) { } array(0) { } array(0) { } array(0) { }


Quelqu'un voit d'où cela peut venir ?

Merci! Smiley confused
Modifié par JENCAL (15 Feb 2018 - 17:25)
Salut,

J'ai pas la réponse à ton problème, mais pourquoi est-ce que ta table sur laquelle tu fais ta requête n'est pas une entité? Il y a une raison ou ça pourrait-être corrigé?
Je dis ça parce tu prends peut-être le problème à l'envers.
Pour ma part je n'ai jamais eu besoin de faire de requêtes natives (ça viendra peut-être), j'ai toujours fais des requêtes avec Query builder.
@Raphi : En fait j'ai une dizaine d'entités... mais là j'ai besoin (et j'aurais uniquement besoin) d'une seul requête en particulier... je me suis dit "je vais pas faire une entité (même deux, car jointure)" pour une simple requête select !.... bref..

@pchlj : Je regarde ton lien et je reviens.. merci!
malheureusement pchlj dans ton lien, ils utilisent addEntityResult, ce qui implique qu'ils ont une entité mappé... moi c'est justement ce que je n'ai pas et ce que je ne veux pas faire. J'aimerais juste faire une requête SELECT simple sans entité...

Pour les plus connaisseur de Symfony, le plus curieux c'est que le résultat soit array 0 MAIS dans le profiler j'ai bien tout mes résultat quand je clic au niveau de doctrine (au niveau de la requête elle meme) sur le "Explain query"


Personnellement j'ai utilisé ce tuto
http://doctrine-orm.readthedocs.io/en/latest/reference/native-sql.html
Modifié par JENCAL (16 Feb 2018 - 10:14)
JENCAL a écrit :
@Raphi : En fait j'ai une dizaine d'entités... mais là j'ai besoin (et j'aurais uniquement besoin) d'une seul requête en particulier... je me suis dit "je vais pas faire une entité (même deux, car jointure)" pour une simple requête select !.... bref..

Je pense que tu n'as pas le bon raisonnement. C'est le principe d'un ORM, si on ne l'utilise pas à chaque fois qu'on doit ajouter une table on perds l'intérêt de l'ORM.
De plus lorsque tu voudra réinstaller ton projet tu ne pourras pas générer toutes tes tables avec doctrine il faudra créer celle-ci manuellement.
Pour ta jointure, tu n'as pas besoin de faire une seconde entity (à moins que tu ai besoin de rajouter un champ supplémentaire à ta jointure). Il suffit de faire une association ManyToOne, OneToMany ou ManyToMany.

Je sais que ce n'est pas le débat, mais si je comprend bien, ton problème vient du fait que tu n'utilises pas Symfony de la bonne façon.
JENCAL a écrit :
J'aimerais juste faire une requête SELECT simple sans entité...

De ce que je viens de lire, à priori NativeQuery n'est pas fait pour ça. Ça te permet de faire des requêtes natives sur des entités.
Donc il faut que tu appliques cette solution dans ton cas: https://stackoverflow.com/a/6874495
L'intérêt reste très limité. Et si tes tables proviennent de ton projet, alors je te conseilles de les créer par l’intermédiaire d'entités. Ça sera plus cohérent et plus simple à manipuler.
Meilleure solution
Raphi a écrit :

Je sais que ce n'est pas le débat, mais si je comprend bien, ton problème vient du fait que tu n'utilises pas Symfony de la bonne façon.


Oui j'imagine... ça fait que 4 mois que j'utilise Symfony (2)..

Du coup ta raison.. tu dis que je prend le problème à l’envers car je veux utiliser un ORM pour faire du "PAS ORM" (pas très français mais on se comprend)..
Du coup Smiley idee ! je vais utilisé un bon vieux prepare / execute / fetchall....
Car je maintiens que pour une simple requête select, je n'ai pas besoin d'une entité.

Je rebondis également sur ta phrase (peut être je me trompe)
@"De plus lorsque tu voudra réinstaller ton projet tu ne pourras pas générer toutes tes tables avec doctrine il faudra créer celle-ci manuellement."

Pourtant, je génère toutes mes tables via la commande suivante à partir de mes entités..
doctrine:schema:update --force


Merci à toi.
Raphi a écrit :

De ce que je viens de lire, à priori NativeQuery n'est pas fait pour ça. Ça te permet de faire des requêtes natives sur des entités.
Donc il faut que tu appliques cette solution dans ton cas: https://stackoverflow.com/a/6874495
L'intérêt reste très limité. Et si tes tables proviennent de ton projet, alors je te conseilles de les créer par l’intermédiaire d'entités. Ça sera plus cohérent et plus simple à manipuler.


Oui c'est ce que j'ai vu à l'instant haha
Je viens également de comprendre que NativeQuery tu permet de faire du native sur tes classe entité... pas sur sur Native pure comme je l'imaginais..
JENCAL a écrit :

Je rebondis également sur ta phrase (peut être je me trompe)
@"De plus lorsque tu voudra réinstaller ton projet tu ne pourras pas générer toutes tes tables avec doctrine il faudra créer celle-ci manuellement."

Pourtant, je génère toutes mes tables via la commande suivante à partir de mes entités..
doctrine:schema:update --force

...
Y'a un truc qui m'échappe. Smiley eek
Si tu repars d'une base de données vide sans tables. Cette commande te permet de créer toutes tes tables? Si c'est le cas c'est que tu as créé une entité pour toutes ces tables.

Tu ne confondrais pas repository et entity par hasard ?
Raphi a écrit :

...
Y'a un truc qui m'échappe. Smiley eek
Si tu repars d'une base de données vide sans tables. Cette commande te permet de créer toutes tes tables? Si c'est le cas c'est que tu as créé une entité pour toutes ces tables.

Tu ne confondrais pas repository et entity par hasard ?


Non je ne confond pas.. chacune des mes entités ont été créer manuellement, et par la suite avec la commande au dessus pour créer les tables physique.
Modifié par JENCAL (16 Feb 2018 - 11:39)
Raphi a écrit :
Désolé je suis têtu mais je déteste ne pas comprendre ! Smiley lol


c'est peut être moi qui confond tout aussi ^^
En fait t'essayes de faire une requête sur une table de jointure, c'est pour ça que tu disais ne pas avoir d'entité derrière non?
Si c'est bien ça, il ne faut pas faire d'entité exprès en effet, mais tu peux quand même faire des requêtes avec Doctrine puisque tout est correctement mappé.
C'est juste qu'au lieu d'attaquer directement la table de jointure concernée, il faut attaquer par l'une des entité qui s'occupe de la jointure et faire la jointure dans ta requête. Comme ça tu peux faire un select sur n'importe quel champ de ta jointure en continuant d'utiliser l'ORM.

Mais bon si la solution précédente fonctionne c'est l'essentiel. Smiley smile