2013-02-23 31 views
6

Tôi đang cố gắng tinh chỉnh truy vấn cố gắng chọn ít giá trị có thể hơn. Ví dụ: Tôi có một thực thể "Anagrafic" có chứa tên, địa chỉ, thành phố, v.v. và một hình thức mà tôi muốn thay đổi chỉ một trong những lĩnh vực này, chẳng hạn như địa chỉ. Tôi đã tạo ra truy vấn này:Symfony2 Chọn một cột trong học thuyết

//AnagraficRepository 
public function findAddress($Id) 
{ 
    $qb = $this->createQueryBuilder('r') 
      ->select('r.address') 
      ->where('r.id = :id') 
      ->setParameter('id', $Id) 
      ->getQuery(); 

    return $qb->getResult(); 
} 

có cái gì đó sai với truy vấn này bởi vì tôi không trả lại bất kỳ giá trị, nhưng nếu tôi làm các truy vấn thông thường:

//Controller 
$entity = $em->getRepository('MyBusinessBundle:Anagrafic')->find($id); 

Return giá trị đúng. Tôi làm cách nào để truy vấn chỉ chọn một cột?

+2

Mục tiêu của tôi là để giảm kích thước của truy vấn, trả về một cột đơn hơn 30 cột là tốt hơn nhiều về hiệu suất! – Lughino

+2

Sau đó, bạn sẽ làm điều đó ở khắp mọi nơi? Tôi nên tách bảng của bạn cho vài bảng khác trong trường hợp này. – Hast

+4

Tôi nghĩ đó là một cách tốt để đạt được hiệu suất! Nếu bạn không đồng ý không quan trọng .. – Lughino

Trả lời

11

Vì bạn đang yêu cầu một cột của mỗi bản ghi mà bạn nhất định mong đợi là array. Điều đó đang được nói, bạn nên thay thế getResult với getArrayResult() bởi vì bạn không thể thực thi đối tượng hydrat hóa:

$data = $qb->getArrayResult(); 
Now, you have structure: 
    $data[0]['address'] 
    $data[1]['address'] 
    .... 

Hope this helps.

Đối với các cuộc thảo luận về hiệu suất trong ý kiến ​​tôi thường đồng ý với bạn vì không muốn tất cả 30 cột lấy mỗi lần. Tuy nhiên, trong trường hợp đó, bạn nên cân nhắc viết truy vấn được đặt tên để giảm thiểu tác động nếu cơ sở dữ liệu của bạn bị thay đổi.

+0

Thực sự cảm ơn bạn rất nhiều vì đã giúp đỡ! Chính xác là thông tin tôi đang tìm kiếm! – Lughino

7

Bạn có thể sử dụng partial objects để chỉ hydrat một trường và vẫn trả về một đối tượng.

+2

Cảm ơn bạn! Đây cũng là một giải pháp tuyệt vời! – Lughino

2

Sử dụng đối tượng cục bộ như thế này để chọn các lĩnh vực

$qb = $this->createQueryBuilder('r') 
    ->select(array('partial r.{id,address}')) 
    ... 

Đặt tên trường của bạn giữa các dấu ngoặc

+0

... nhưng hãy ghi nhớ tài liệu http://doctrine-orm.readthedocs.org/en/latest/reference/partial-objects.html – TheFrost

3

này đã làm việc cho tôi:

$qb = $repository->createQueryBuilder('i') 
    ->select('i.name') 
    ->... 
Các vấn đề liên quan