2013-03-16 73 views
1

在Symfony的「書」中,他們討論實體並引用其他實體。就我而言,如果我有一個帶有許多引用它的「Comment」實體的「Post」實體,我可以通過它的ID加載Post,然後執行$ post-> getComments()。使用Doctrine,您如何從EntityRepository中訪問實體方法?

評論是懶惰加載,看來,我將不得不逐一通過他們,加載每個(這顯然是錯誤的)或加載它們在一個單獨的查詢(我可以做的,但我不知道在哪裏,具體來說,把這個查詢)。 The Book, however, suggests:「當然,如果您知道前臺需要訪問這兩個對象,則可以通過在原始查詢中發出連接來避免第二個查詢。」它建議我向我的(當前爲空)postRepository類添加一個方法。我做的,它看起來像這樣:

public function loadPostFull($pid) 
{ 
    return $this->getEntityManager() 
     ->createQuery(' 
      SELECT p, c FROM BUNDLENAME:Post p 
      JOIN p.comments c 
      WHERE p.id = :id') 
     ->setParameter('id', $pid); 
    try { 
     return $query->getSingleResult(); 
    } catch (\Doctrine\ORM\NoResultException $e) { 
     return null; 
    } 
} 

然後在我的控制器我做的:

$fullPost = $this->getDoctrine() 
      ->getRepository('BUNDLENAME:Post') 
      ->loadPostFull($id); 
$id = $fullPost->getId(); 

但是我的$ ID簡單的要求提供了一個「致命錯誤:調用未定義的方法原則\ ORM \查詢::的getId()」。我知道控制器正確地找到了loadPostFull方法,因爲如果我打錯了名字,它將會在那裏失敗。這只是沒有返回一個適當的郵政實體。如果我改變控制器來調用 - > find($ id)而不是 - > loadPostFull($ id),我可以使用Post id的所有內部方法。

該手冊似乎表明我可以做到這一點!怎麼了?

回答

2

我相信你有一個錯字:)。看看你的代碼的第一行。你有一個返回聲明!因此,您返回Query對象並嘗試{} catch(){}永遠不會到達。你應該把這樣的:

$query = $this->getEntityManager() 
    ->createQuery(' 
     SELECT p, c FROM BUNDLENAME:Post p 
     JOIN p.comments c 
     WHERE p.id = :id') 
    ->setParameter('id', $pid); 
try { 
    return $query->getSingleResult(); 
} catch (\Doctrine\ORM\NoResultException $e) { 
    return null; 
} 
+0

韋爾普,你做到了!非常感謝。現在你想來寫我的程序的其餘部分嗎? :-偉大的工作。 – Offlein 2013-03-16 15:09:07

+0

那麼我知道這些「錯誤」可能會有多糟糕。你脫下你的頭髮,你只是沒有注意到它:) – Viorel 2013-03-17 08:29:49

相關問題