Построитель запросов Doctrine 2 и индекс по - PullRequest
15 голосов
/ 13 декабря 2011

Можно ли использовать индекс с помощью построителя запросов doctrine 2, и если да, то каков правильный синтаксис?

Ответы [ 6 ]

42 голосов
/ 27 февраля 2013

Начиная с версии 2.2, теперь вы можете включить INDEX BY в свой оператор from. Если вы добавляете предложение from,

$qb->from($class, $alias, $indexBy);

Если у вас уже есть предложение from, которое вы хотите заменить, вы можете заменить его на:

$qb->add('from', new Expr\From($class, $alias, $indexBy), false);

Существует открытый запрос на извлечение, чтобы добавить его в функцию createQueryBuilder в репозитории, так что, надеюсь, это будет добавлено в ближайшее время.

6 голосов
/ 15 декабря 2012

Для обновления. Вы можете сделать что-то вроде этого.

$qb = $entityManager->createQueryBuilder();
$qb->from($repository->getClassName(), 'a', 'a.id');
$qb->select(a);

$result = new ArrayCollection($qb->getQuery()->getResult());

В результате коллекция массивов будет содержать правильно проиндексированные элементы.

4 голосов
/ 06 июля 2012

Вот одно решение при использовании построителя запросов, использующего ручное введение индекса по выражению -

(do you querybuilder statement)
$q  = $q->getQuery()->setDQL(str_replace('WHERE', 'INDEX BY yourIndexValue WHERE', $q->getDQL()));

Кажется, это работает для меня ...

2 голосов
/ 28 октября 2016

Правильный синтаксис и простейший будет:

$enityManager->getRepository('AppBundle:Entity')->createQueryBuilder('entity', 'entity.name')->getQuery()->getResult();

Индексирует результат по полю имени сущности.

0 голосов
/ 08 сентября 2016

Вы также можете использовать INDEX BY по умолчанию внешнего ключа, например, "yourIndexValue_id", прямо в вашем отображении:

/**
 * @ORM\OneToMany(targetEntity="Bar", mappedBy="foo", indexBy="bar_id")
 */
protected $bars;

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

Работа с индексированными ассоциациями

0 голосов
/ 09 февраля 2012

Да, это возможно, используя построитель запросов.Небольшой пример, давайте предположим, что мы хотим индексировать по t.someField.Смотрите третий аргумент из метода.

<?php
$query = $em->createQueryBuilder()
    ->select('t.somefield', 't.someOtherField')
    ->setFrom('Entity\Table', 't', 't.someField')
    ->getQuery()
$results = $query->getArrayResult();

//your result will look something like:
$results['somefieldvalue'] = array(array('somefield' => 'value', 'someOtherField' => 'test'));
?>

Это должно работать как минимум в Doctrine 2.1.В Doctrine 2.0 это пока не поддерживается.В Doctrine 2.0 он поддерживается только при указании его с помощью DQL.

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