2011-12-13 57 views

回答

4

这是一个使用的QueryBuilder时,使用索引的手工注射by子句一个解决方案 -

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

这似乎为我工作...

+0

我意识到这是一个非常古老的答案,但我只想指出,这不适用于没有任何WHERE子句的查询。 – rpkamp 2016-02-03 11:30:05

-1

是的,这是可能的,使用查询生成器。一个小例子,让我们假设我们想通过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指定时才支持。

+2

随着Doctrine 2.1.0-DEV,我使用`$ qb-> add('from','Entity \ Table t INDEX BY t.id');` – Maxence 2012-02-18 13:30:23

6

对于更新。你可以做这样的事情。

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

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

因此,数组集合将包含正确索引的元素。

40

从2.2开始,您现在可以在您的from语句中包含INDEX BY。如果要添加从第一个,

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

如果你已经有了一个FROM子句中要替换,那么你可以将其替换为:

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

有一个开放的拉请求添加它到存储库的createQueryBuilder函数,希望这会很快加入。

+6

这应该是正确的答案。 – imclickingmaniac 2014-04-25 09:32:50

0

您还可以使用外键的默认INDEX BY,例如,直接在您的映射“yourIndexValue_id”:

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

不幸的是它似乎并没有被记录,你必须使用外键本身的列的名称。

Working with Indexed Associations

2

的语法正确,最简单的是:

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

这将指数实体名称字段的结果。