Gare au whereIn !

2 gravatar Par Grégoire Marchal - 17/10/2010

Doctrine c'est cool, ça simplifie la vie, on n'a plus à se palucher des énormes requêtes SQL à la main, ça fait plaisir. Mais parfois c'est vicieux Doctrine. Dernier exemple en date avec la méthode whereIn(). A priori, rien de compliqué avec cette méthode, elle transforme gentiment ça :

$query->whereIn('id', array(1, 2, 3))

En ça :

AND id IN (1, 2, 3)

Mais imaginons que le tableau que vous lui passez est construit dynamiquement, et que parfois il est vide... Que se passe-t-il dans ce cas ? Avec MySQL, l'instruction "IN ()" retourne une erreur. Que fait Doctrine ? Eh bien... Rien. Il ignore le critère et effectue la requête, donnant des résultats souvent trompeurs... Une exception est censée être levée, mais une coquille dans le code fait qu'elle ne l'est pas. Un ticket est ouvert chez Doctrine... Attention donc !

Retour à l'accueil

Commentaires (2)

gravatar Par Bourvill, le 18/10/2010 à 21:17
Bon a savoir :)
gravatar Par Snark, le 07/02/2011 à 14:10
Le IN de doctrine me semble boiteux en générale. Les comportements sont différent entre les syntaxe suivante (quand ils fonctionnent, alors qu’ils serait logique qu’ils soient identique):
->innerJoin(‘table WITH x IN (?) AND y IN (?)’, array($x,$y))

->where(‘x IN (?)’, $x)

->where(‘x IN ?’, $x)

->whereIn(‘x’, $x)

D’ailleurs, si il y a une méthode pour éviter les requêtes multiples du WhereIn, ça m’arrangerai. J’ai un projet comportant de forte charge sur le serveur SQL, alors avoir un
DQ::create()->from(‘table’)->whereIn(‘val’,$vals);

Tranformé en:
SELECT id FROM table WHERE val IN (‘a’,'b’,'c’);
SELECT * FROM table WHERE id IN (1,2,3);

au lieu d’un simple
SELECT * FROM table WHERE val IN (‘a’,'b’,'c’);

m’ajoute une charge inutile…

Commenter