我是Symfony的新手并浏览Symfony网站上的这本书,确切地说是this部分。
在第一个例子中,以下函数用于连接两个表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 产品具有任何已分配的类别,但如果产品没有任何分配类别我得到错误
Call to a member function getCategory() on a non-object
如果我删除代码$category = $product->getCategory();
并访问未分配类别的产品,那么我会收到404
如果有人能向我解释为什么会发生这种情况,我将非常感激。
答案 0 :(得分:1)
$ class = $ product-> getCategory();如果你不需要这个变量$ category,那就没用了。 如果你没有在查询中加入此行$ category = $ product-> getCategory();将对数据库进行另一次查询以获取类别。
对于twig {{product.category.name}},如果没有JOIN且没有关系,则该类别为null,与$ category = $ product-> getCategory()无关;代码。