Можно ли использовать индекс с помощью построителя запросов doctrine 2, и если да, то какой правильный синтаксис?
Конструктор запросов Doctrine 2 и индекс
Ответ 1
Здесь одно решение при использовании querybuilder, используя ручную инъекцию индекса по условию -
(do you querybuilder statement)
$q = $q->getQuery()->setDQL(str_replace('WHERE', 'INDEX BY yourIndexValue WHERE', $q->getDQL()));
Кажется, это работает для меня...
Ответ 2
Начиная с 2.2, теперь вы можете включить INDEX BY в свой оператор from. Если вы добавляете предложение from,
$qb->from($class, $alias, $indexBy);
Если у вас уже есть предложение from, которое вы хотите заменить, вы можете его заменить:
$qb->add('from', new Expr\From($class, $alias, $indexBy), false);
Есть открытый запрос на добавление, чтобы добавить его в функцию Repository createQueryBuilder, так что, надеюсь, это скоро будет добавлено.
Ответ 3
Для обновления. Вы можете сделать что-то вроде этого.
$qb = $entityManager->createQueryBuilder();
$qb->from($repository->getClassName(), 'a', 'a.id');
$qb->select(a);
$result = new ArrayCollection($qb->getQuery()->getResult());
В результате коллекция массива будет содержать правильно индексированные элементы.
Ответ 4
Правильный синтаксис и самый простой:
$enityManager->getRepository('AppBundle:Entity')->createQueryBuilder('entity', 'entity.name')->getQuery()->getResult();
Это будет индексировать результат по имени имени объекта.
Ответ 5
Вы также можете использовать INDEX BY по умолчанию для внешнего ключа, например. "yourIndexValue_id" непосредственно в вашем отображении:
/**
* @ORM\OneToMany(targetEntity="Bar", mappedBy="foo", indexBy="bar_id")
*/
protected $bars;
К сожалению, похоже, что не указано, что вам нужно использовать имя столбца самого внешнего ключа.
Ответ 6
Да, это возможно, используя построитель запросов. Небольшой пример, предположим, что мы хотим индексировать 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'));
?>
Это должно работать как минимум в Доктрине 2.1. В Doctrine 2.0 он еще не поддерживается. В Doctrine 2.0 он поддерживается только при указании его с помощью DQL.