2011-12-13 61 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(); 

這將指數實體名稱字段的結果。