2012-10-29 7 views
21

tôi có phương pháp này:Mong đợi một hoặc không có kết quả từ trình tạo truy vấn học thuyết, tôi nên sử dụng cái gì?

public function getMonth ($month_name) 
    { 
     $q = $this->createQueryBuilder('m'); 

     $q->select('m') 
      ->where('m.name = :name')  
      ->setParameter('name', $month_name); 

     return $q->getQuery()->getResult(); 
    } 

Từ đó tôi mong đợi để tìm một tháng hoặc 0 tháng. Tôi sử dụng phương pháp này theo cách này trong bộ điều khiển của tôi:

$month = $em->getRepository('EMExpensesBundle:Month') 
       ->getMonth($this->findMonth()); 

      $month->setSpended($item->getPrice()); 

Tôi cố gắng này với getSingleResult() và tất cả mọi thứ đã được hoàn hảo cho đến khi tôi tình cờ gặp một trường hợp khi không có tháng đã được tìm thấy và tất cả mọi thứ không thực sự tồi tệ!

Sau đó, tôi đã cố gắng với getResult(), nhưng nó sẽ trả về một mảng và sau đó

$month->setSpended($item->getPrice()); 

được cho là kêu gọi một tổ chức phi vật thể và để sửa chữa nó tôi nên sử dụng ở khắp mọi nơi

$month[0]->setSpended($item->getPrice()); 

Liệu có một cách thanh lịch hơn để đạt được điều này mà không cần thêm chỉ số không cần thiết [0] ở khắp mọi nơi?

Trả lời

30

Nếu bạn sử dụng getSingleResult, Doctrine sẽ ném một \Doctrine\ORM\NoResultException, bạn có thể nắm bắt và xử lý nó. Nếu bạn muốn bắt này trực tiếp trong Repository, tôi sẽ đề nghị:

public function getMonth ($month_name) 
{ 
    $q = $this->createQueryBuilder('m'); 

    $q->select('m') 
     ->where('m.name = :name')  
     ->setParameter('name', $month_name); 

    try { 
     return $q->getQuery()->getResult(); 
     } 
    catch(\Doctrine\ORM\NoResultException $e) { 
     return new Month(); 
    } 
} 

Dont quên thêm một use Your\Namespace\Month; hoặc này sẽ thất bại vì nó không thể tìm thấy những lớp Tháng!

Tất nhiên bạn cũng phải duy trì thực thể trong trường hợp đó là thực thể mới. Bạn có thể mở rộng khối catch như thế này:

catch(\Doctrine\ORM\NoResultException $e) { 
    $month = new Month(); 
    $this->_em->perist($month); 

    return $month; 
} 

Bạn cũng có thể nắm bắt ngoại lệ trong bộ điều khiển, làm cho nó trong suốt hơn. Nhưng điều này phụ thuộc vào trường hợp sử dụng của bạn và được giải quyết tốt nhất một mình

+0

Cảm ơn bạn rất nhiều! :) – Faery

61

Thêm vào đó, trong học thuyết 2.1 bạn có thể sử dụng 'getOneOrNullResult'

http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#query-result-formats

+0

Bạn đã lưu ngày của tôi :). Cảm ơn bạn! –

+0

Tốt hơn là cố gắng ... bắt trong kho. Nên là câu trả lời cho câu hỏi! –

+4

Hãy cẩn thận, nếu có nhiều hơn một kết quả nó chỉ trả về một ngoại lệ .. Không phải là một giá trị null. https://coderwall.com/p/prbrlw/doctrine-get-single-row-or-null: không có kết quả: trả về null // nhiều hơn một kết quả: ném một ngoại lệ NonUniqueResultException – Delphine