68 votes

doctrine: QueryBuilder vs createQuery?

Dans la Doctrine, vous pouvez créer DQL de 2 façons:

EntityManager::createQuery:

$query = $em->createQuery('SELECT u FROM MyProject\Model\User u WHERE u.id = ?1');

QueryBuilder:

$qb->add('select', 'u')
   ->add('from', 'User u')
   ->add('where', 'u.id = ?1')
   ->add('orderBy', 'u.name ASC');

Je me demande quelle est la différence et lequel dois-je utiliser?

66voto

jackbravo Points 691
  1. DQL est plus facile à lire car il est très similaire à SQL. Si vous n'avez pas besoin de modifier la requête en fonction d'un ensemble de paramètres c'est probablement le meilleur choix.

  2. Query Builder est une api pour construire des requêtes, il est donc plus facile si vous avez besoin de construire une requête dynamiquement comme une itération sur un ensemble de paramètres ou de filtres. Vous n'avez pas besoin de faire toutes les opérations de la chaîne pour construire votre requête comme rejoindre, split ou quoi que ce soit.

33voto

Martin Kočička Points 302

Générateur de requêtes est juste, disons, l'interface de création de requête... Il devrait être plus à l'aise pour l'utiliser, il n'a pas juste la méthode add (), mais également d'autres méthodes comme l'endroit où(), et où () de(), etc. Mais à la fin, il vient de se compose de requête comme celle que vous utilisez dans le createQuery() la méthode.

Exemple d'utilisation plus poussée de générateur de requêtes:

$em->createQueryBuilder()
            ->from('Project\Entities\Item', 'i')
            ->select("i, e")
            ->join("i.entity", 'e')
            ->where("i.lang = :lang AND e.album = :album")
            ->setParameter('lang', $lang)
            ->setParameter('album', $album);

13voto

Vincent Pazeller Points 314

Ils ont différents objectifs:

  • DQL est plus facile à utiliser lorsque vous savez que votre requête complète.
  • Générateur de requêtes est plus intelligent lorsque vous devez construire votre requête sur la base de certaines conditions, boucles, etc.

4voto

NiteRain Points 83

La principale différence est la surcharge de l'appel de méthodes. Votre premier exemple de code (createQuery) pour des raisons de simplicité fait un appel de méthode, alors que le queryBuilder fait 4. À la fin de tout, ils viennent vers le bas à une chaîne de caractères qui doit être exécutée, le premier exemple que vous donnez de la chaîne, et de l'autre vous êtes à la construction de plusieurs enchaîné les appels de méthode.

Si vous êtes à la recherche d'une raison d'utiliser l'un sur l'autre, c'est une question de style, et ce qui semble plus lisible. Pour moi, j'aime le queryBuider la plupart du temps, il fournit des sections bien définies pour la requête. Aussi, dans le passé, il rend plus facile d'ajouter dans la logique conditionnelle lorsque vous en avez besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X