Доктрина: QueryBuilder против createQuery? - PullRequest
66 голосов
/ 21 апреля 2010

В Doctrine вы можете создать DQL двумя способами:

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');

Интересно, в чем разница и какую мне использовать?

Ответы [ 5 ]

64 голосов
/ 09 декабря 2010
  1. DQL легче читать, поскольку он очень похож на SQL. Если вам не нужно менять запрос в зависимости от набора параметров, это, вероятно, лучший выбор.

  2. Query Builder - это API для построения запросов, поэтому проще, если вам нужно построить запрос динамически, как итерация по набору параметров или фильтров. Вам не нужно выполнять какие-либо строковые операции для построения вашего запроса, такие как соединение, разбиение или что-то еще.

32 голосов
/ 09 декабря 2010

Построитель запросов - это, скажем, интерфейс для создания запроса ... Он должен быть более удобным для использования, у него есть не только метод add (), но и такие методы, как where () иWhere (), from ( ) и т. д. Но, в конце концов, он просто создает запрос, подобный тому, который вы используете в методе createQuery ().

Пример более продвинутого использования построителя запросов:

$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);
13 голосов
/ 16 августа 2012

Они имеют разные цели:

  • DQL легче использовать, когда вы знаете полный запрос.
  • Построитель запросов умнее, когда вам нужно построить запрос на основе некоторых условий, циклов и т. Д.
4 голосов
/ 05 июня 2014

Основное отличие заключается в накладных расходах на вызов методов. Ваш первый пример кода (createQuery) просто для простоты делает один вызов метода, а queryBuilder - 4. В конце всего они сводятся к строке, которую нужно выполнить, в первом примере вы даете ей строку, и другой - вы создаете его с помощью нескольких вызовов методов.

Если вы ищете причину использовать один над другим, это вопрос стиля и того, что выглядит более читабельным. Для меня мне больше всего нравится queryBuider, он предоставляет четко определенные разделы для запроса. Кроме того, в прошлом было проще добавлять условную логику, когда она вам нужна.

1 голос
/ 07 апреля 2015

Может быть проще выполнить модульное тестирование при использовании построителя запросов. Допустим, у вас есть хранилище, которое запрашивает некоторые данные на основе сложного списка условий. И вы хотите убедиться, что если определенное условие передается в хранилище, некоторые другие условия добавляются в запрос. В случае DQL у вас есть два варианта:

1) Использовать светильники и проверить реальное взаимодействие с БД. Который я нахожу несколько проблематичным и неуместным.

2) Для проверки сгенерированного кода DQL. Что может сделать ваш тест слишком хрупким.

С QueryBuilder вы можете заменить его на mock и убедиться, что вызывается метод "andWhere" с необходимым параметром. Конечно, такие соображения неприменимы, если ваш запрос прост и не зависит от каких-либо параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...