2014-09-02 75 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()无关。码。