Php Symfony加入相关记录

Php Symfony加入相关记录,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我是Symfony的新手,正在浏览Symfony网站上的这本书,确切地说是一节 在第一个示例中,以下函数用于连接两个表product和category,这非常有意义 public function findOneByIdJoinedToCategory($id) { $query = $this->getEntityManager() ->createQuery( 'SELECT p, c FROM AcmeStoreBundle:Pr

我是Symfony的新手,正在浏览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()是指如果我保持原样,它可以正常工作如果产品有任何指定类别,但是如果产品没有任何指定类别,我会得到错误

对非对象调用成员函数getCategory()

如果我删除代码
$category=$product->getCategory()
并访问未分配类别的产品,然后我得到一个错误,我应该
404


如果有人能向我解释为什么会发生这种情况,我将不胜感激。

行$category=$product->getCategory();如果您不需要此变量$category,则无效。 如果您没有加入查询,则此行$category=$product->getCategory();将对数据库进行另一个查询以获取类别


对于细枝{{product.category.name},如果没有连接,也没有关系,则该类别将为空,与$category=$product->getCategory()无关;代码。

我可以说,当实体双向连接时,select中的
p
c
都没有意义。我建议检查
$product
是否为空,因为如果它找不到任何记录或找到多个记录
getSingleResult
将抛出异常,函数将返回
null
;在此基础上,会出现错误。谢谢,但我想知道为什么要使用此代码
$category=$product->getCategory()
由于函数返回一个产品,
join
已经在获取类别时。您还希望如何获得该类别?使用查询加入类别的目的是避免延迟加载,当您需要类别时,这需要额外的sql语句。感谢@Cerad的解释,如果我不使用
$category=$product->getCategory(),我正在尝试理解这个概念我仍然可以通过{{product.category.name}访问类别名称,这让我感到困惑。问题不是第二个函数为什么存在,我想知道它为什么存在,我只是想了解为什么使用
$category=$product->getCategory()当我们已经可以通过连接访问类别名称时