原则2查询生成器和索引
这是一个使用的QueryBuilder时,使用索引的手工注射by子句一个解决方案 -
(do you querybuilder statement)
$q = $q->getQuery()->setDQL(str_replace('WHERE', 'INDEX BY yourIndexValue WHERE', $q->getDQL()));
这似乎为我工作...
是的,这是可能的,使用查询生成器。一个小例子,让我们假设我们想通过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指定时才支持。
随着Doctrine 2.1.0-DEV,我使用`$ qb-> add('from','Entity \ Table t INDEX BY t.id');` – Maxence 2012-02-18 13:30:23
对于更新。你可以做这样的事情。
$qb = $entityManager->createQueryBuilder();
$qb->from($repository->getClassName(), 'a', 'a.id');
$qb->select(a);
$result = new ArrayCollection($qb->getQuery()->getResult());
因此,数组集合将包含正确索引的元素。
从2.2开始,您现在可以在您的from语句中包含INDEX BY。如果要添加从第一个,
$qb->from($class, $alias, $indexBy);
如果你已经有了一个FROM子句中要替换,那么你可以将其替换为:
$qb->add('from', new Expr\From($class, $alias, $indexBy), false);
有一个开放的拉请求添加它到存储库的createQueryBuilder函数,希望这会很快加入。
这应该是正确的答案。 – imclickingmaniac 2014-04-25 09:32:50
您还可以使用外键的默认INDEX BY,例如,直接在您的映射“yourIndexValue_id”:
/**
* @ORM\OneToMany(targetEntity="Bar", mappedBy="foo", indexBy="bar_id")
*/
protected $bars;
不幸的是它似乎并没有被记录,你必须使用外键本身的列的名称。
的语法正确,最简单的是:
$enityManager->getRepository('AppBundle:Entity')->createQueryBuilder('entity', 'entity.name')->getQuery()->getResult();
这将指数实体名称字段的结果。
我意识到这是一个非常古老的答案,但我只想指出,这不适用于没有任何WHERE子句的查询。 – rpkamp 2016-02-03 11:30:05