Symfonic Parlons de trucs sur Symfony !

17oct/103

Gare au whereIn !

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 :

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

En ça :

  1. 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 !

About Grégoire Marchal

Another Symfony developer...
Commentaires (3) Trackbacks (0)
  1. Bon a savoir :)

  2. Awesome. Greetings from the Speedy DNS.

  3. 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…


Laisser un commentaire


Aucun trackbacks pour l'instant