Подтвердить что ты не робот

Конструктор запросов Doctrine 2 и индекс

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

4b9b3361

Ответ 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.