在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的所有內部方法。
該手冊似乎表明我可以做到這一點!怎麼了?
韋爾普,你做到了!非常感謝。現在你想來寫我的程序的其餘部分嗎? :-偉大的工作。 – Offlein 2013-03-16 15:09:07
那麼我知道這些「錯誤」可能會有多糟糕。你脫下你的頭髮,你只是沒有注意到它:) – Viorel 2013-03-17 08:29:49