2011-12-13 5 views

답변

4

은 다음 절에서 인덱스를 수동으로 주입을 사용하여, querybuilder를 사용하여 하나 개의 솔루션입니다. 이런 식으로 할 수 있습니다.

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

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

결과적으로 배열 컬렉션에는 적절하게 색인 된 요소가 포함됩니다.

+0

이것은 아주 오래된 답변이지만, 이것은 WHERE 절이없는 쿼리에 대해서는 작동하지 않는다는 점을 지적하고자합니다. – rpkamp

-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로 지정할 때만 지원됩니다.

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

이 나를 위해 작동하는 것 같다 ...

+2

Doctrine 2.1.0-DEV에서는'$ qb-> add ('from', 'Entity \ Table t INDEX BY t.id'); '를 사용합니다. – Maxence

6

업데이 트 용 -

40

2.2부터는 이제 from 문에 INDEX BY를 포함 할 수 있습니다. 당신이 절에서를 추가하는 경우 이미 교체 할 그 절에서이있는 경우

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

는, 당신은 그것을 대체 할 수

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

을 추가 오픈 풀 요청있다 Repository의 createQueryBuilder 함수에도 추가 할 수 있으므로 곧 추가 될 것입니다.

+6

정답이어야합니다. – imclickingmaniac

+0

안녕하세요, 2015 년부터 글을 올리면서 아직 없습니다 :-( – zerkms

+0

거부되었습니다 ... https://github.com/doctrine/doctrine2/pull/592 – cmenning

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(); 

.