2011-12-13 21 views

Trả lời

4

Dưới đây là một giải pháp khi sử dụng querybuilder, sử dụng phun thủ công của chỉ số quy định tại khoản -

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

Điều này dường như làm việc cho tôi ...

+0

Tôi nhận ra đây là câu trả lời rất cũ, nhưng tôi chỉ muốn chỉ ra rằng điều này sẽ không hoạt động đối với các truy vấn không có bất kỳ mệnh đề WHERE nào. – rpkamp

-1

Có thể, bằng cách sử dụng trình tạo truy vấn. Một ví dụ nhỏ, giả sử chúng ta muốn index bằng t.someField. Xem đối số thứ ba trong phương thức.

<?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')); 
?> 

Điều này sẽ hoạt động trong Doctrine 2.1 ít nhất. Trong Doctrine 2.0, nó chưa được hỗ trợ. Trong Doctrine 2.0, nó chỉ được hỗ trợ khi bạn chỉ định nó với DQL.

+2

Với Doctrine 2.1.0-DEV, tôi sử dụng '$ qb-> add ('from', 'Entity \ Table t INDEX BY t.id');' – Maxence

6

Đối với một bản cập nhật. Bạn có thể làm một cái gì đó như thế này.

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

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

Kết quả là, tập hợp mảng sẽ chứa các phần tử được lập chỉ mục phù hợp.

40

Bắt đầu với 2.2, giờ đây bạn có thể bao gồm INDEX BY trong báo cáo từ của mình. Nếu bạn đang thêm một từ khoản,

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

Nếu bạn đã có một từ khoản mà bạn muốn thay thế, sau đó bạn có thể thay thế nó bằng:

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

Có một yêu cầu kéo mở để thêm nó với hàm createQueryBuilder của Repository, vì vậy hy vọng điều này sẽ sớm được bổ sung.

+6

Đây phải là câu trả lời đúng. – imclickingmaniac

+0

Xin chào, tôi đang viết từ năm 2015 và chưa có :-( – zerkms

+0

Nó đã bị từ chối ... https://github.com/doctrine/doctrine2/pull/592 – cmenning

0

Bạn cũng có thể sử dụng INDEX BY mặc định của khóa ngoại, ví dụ: "yourIndexValue_id" trực tiếp trong ánh xạ của bạn:

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

Thật không may là dường như không được ghi chép rằng bạn phải sử dụng tên cột của chính khóa ngoại.

Working with Indexed Associations

2

Cú pháp thích hợp và đơn giản nhất sẽ là:

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

này sẽ chỉ số kết quả bởi Entity trường tên.

Các vấn đề liên quan