2014-09-02 74 views
0

我是Symfony的新手,並且在Symfony網站上閱讀這本書,確切地說是this部分。Symfony加入相關記錄

在第一個例子以下函數用於連接兩個表productcategory,它是可以實現完美的感覺

public function findOneByIdJoinedToCategory($id) 
{ 
    $query = $this->getEntityManager() 
     ->createQuery(
      'SELECT p, c FROM AcmeStoreBundle:Product p 
      JOIN p.category c 
      WHERE p.id = :id' 
     )->setParameter('id', $id); 

    try { 
     return $query->getSingleResult(); 
    } catch (\Doctrine\ORM\NoResultException $e) { 
     return null; 
    } 
} 

什麼我不明白的是第二個例子,

public function showAction($id) 
{ 
    $product = $this->getDoctrine() 
     ->getRepository('AcmeStoreBundle:Product') 
     ->findOneByIdJoinedToCategory($id); 

    $category = $product->getCategory(); 
} 

當第一個函數中有兩個表加入時,第二個函數中的$category = $product->getCategory();的目的是什麼?

我有這個代碼$category = $product->getCategory();的問題是,如果我離開它,因爲它是正常工作IF產品有任何指定的範疇,但如果產品沒有任何分配的類別i得到錯誤

Call to a member function getCategory() on a non-object

如果我刪除代碼$category = $product->getCategory();,並訪問其中沒有任何類別的分配,然後我得到我應該404

我真的很感激,如果有人可以解釋t的誤差產品我爲什麼會這樣。

+0

我可以說,在實體是雙向連接的時候,select和p都沒有任何意義。我會推薦檢查'$ product'是否爲空,因爲如果它找不到任何記錄或者它發現多條記錄'getSingleResult'會拋出異常並且函數將返回'null';基於你的錯誤出現。 – Javad 2014-09-02 14:36:29

+0

謝謝,但我想知道爲什麼使用此代碼'$ category = $ product-> getCategory();'當'join'已經獲取類別 – Baig 2014-09-02 14:43:21

+0

因爲該函數返回一個產品。你還期望如何獲得這個類別?使用查詢加入類別的目的是避免延遲加載,當需要該類別時需要額外的sql語句。 – Cerad 2014-09-02 14:46:37

回答

1

該行$ category = $ product-> getCategory();如果你不需要這個變量$ category,那就沒用了。 如果你沒有在查詢中加入這一行$ category = $ product-> getCategory();將對數據庫進行另一個查詢以獲取該類別。

至於小枝{{product.category.name}}如果沒有JOIN,並且沒有關係,那麼類別將爲null,它與$ category = $ product-> getCategory()無關。碼。