我是Symfony的新手,并且在Symfony网站上阅读这本书,确切地说是this部分。Symfony加入相关记录
在第一个例子以下函数用于连接两个表product
和category
,它是可以实现完美的感觉
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的误差产品我为什么会这样。
我可以说,在实体是双向连接的时候,select和p都没有任何意义。我会推荐检查'$ product'是否为空,因为如果它找不到任何记录或者它发现多条记录'getSingleResult'会抛出异常并且函数将返回'null';基于你的错误出现。 – Javad 2014-09-02 14:36:29
谢谢,但我想知道为什么使用此代码'$ category = $ product-> getCategory();'当'join'已经获取类别 – Baig 2014-09-02 14:43:21
因为该函数返回一个产品。你还期望如何获得这个类别?使用查询加入类别的目的是避免延迟加载,当需要该类别时需要额外的sql语句。 – Cerad 2014-09-02 14:46:37