Symfony2和Doctrine有空关系

时间:2013-11-18 10:03:01

标签: php symfony doctrine-orm

我刚刚开始学习Symfony2(我没有太多的PHP经验),所以我的问题对某些人来说可能看起来很有趣。我现在正在关注本书的Databases and Doctrine部分,我的问题涉及Fetching Related Objects示例(我使用与文档中相同的代码,因此我不会在此处粘贴所有代码)。

在此示例中,有一个代码可以获取关联的对象:

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

    return array('product' => $product, 'category' => $categoryName);
}

当我在DB中设置了类别引用的Product对象上运行此控制器时,一切正常。不幸的是,当category为null时,它会抛出“FatalErrorException:Error:在非对象”上调用成员函数getName()。

我明白这是因为没有Category对象,所以没有Category名称,但我的问题是处理这种情况的最佳方法是什么?我希望$ categoryName返回null或空字符串以在我的模板中使用,就像任何其他未设置的Product对象属性一样,但由于它来自关联对象我坚持这个问题

2 个答案:

答案 0 :(得分:1)

您可能期望:如果$product->getCategory()没有类别,则调用$product时,会返回空类别。

如果是这样,那就让我们编码。

构造函数应该是:

class Product
{
    /**
     * @var Category $category
     */
    private $category; //clearly mentions that Product has ONE category

    public function __construct()
    {
        $this->category = new Category();
        //initialize this so $this->category is no longer a non-object
    }
}

编辑:

你仍然会得到同样的错误,因为该教条只是将记录同步到类映射中,如

$product = new Product();
$product->setName();
...
$product->setCategory(null); // product has no category, so set null
...

对不起,我可能会骗你的。

虽然学说如上所述,但有两个解决方案的建议:

  1. 修改getter

    “如果产品没有类别,则返回空类别”的其他表达式

    public function getCategory()
    {
        if (null !== $this->category) {
            return $this->category;
        }
    
        return new Category();
    }
    
  2. 将这样一个“ifnull-then”逻辑移入树枝(正如其他人所说)

    控制器中的

    public function showAction($id)
    {
        $product = $this->getDoctrine()->getRepository('AcmeStoreBundle:Product')->find($id);
        //$categoryName = $product->getCategory()->getName();
    
        return array('product' => $product);
    }
    
    模板中的

    ...
    {{ product.category.name|default('no category') }}
    ...
    

    default('no category')可以解决问题。 在以下情况下返回“无类别”:

    • 当内部发生错误时(“当你面对的时候从非对象获取属性”)
    • if $ product-> getCategory() - > getName()是falsy(空字符串,null,0等)
  3. 对我来说,我通常更喜欢2比1,因为它用较少的代码完成。

答案 1 :(得分:0)

您是否在category内初始化了__construct属性?

public function __construct(){
    ....
    $this->category = new ArrayCollection();
    ....
}