在构造函数中初始化集合有什么用?

时间:2015-02-10 13:31:35

标签: php symfony doctrine-orm

我正在使用Doctrine和Symfony,实体生成器在实体的构造函数中初始化集合。例如:

/**
 * @var MyProject\MyBundle\Entity\Foo
 * 
 * @ORM\ManyToMany(targetEntity="MyProject\MyBundle\Entity\Foo")
 */
private $foos;

public function __construct() {
    $this->foos = new \Doctrine\Common\Collections\ArrayCollection();
}

我可以在Doctrine's best practices中读到......这样做是一种很好的做法。

但问题是:有什么兴趣?

如果我在构造函数中删除了这一行,我没有看到任何变化。我猜它是懒加载的,但性能下降是否足以花时间编写构造函数(如果构造函数已经存在,app/console doctrine:generate:entities命令不会向构造函数提供新的ArrayCollection,所以我有手动完成。)

如果这样做真的更好,我应该为所有关系做什么,还是只为nullable=false做一个?

想象一下OneToMany中的实体Car Wheel(不可为空)和OneToMany Passenger(可为空)。我应该只初始化$wheels或两者兼而有之吗?为什么?

1 个答案:

答案 0 :(得分:2)

Doctrine实体只是普通对象。从数据库加载实体时,Doctrine从不调用构造函数并负责设置集合。不是很懒,但是Doctrine会确保创建集合。这就是为什么你没有注意到差异。

但是,如果使用“new Entity()”创建新实例,则需要构造函数来初始化集合。如果您的集合未初始化,那么您的添加方法将失败。不要太提及你的获取方法。

无论关系如何,始终初始化所有集合。再一次,如果你没有,那么任何访问它们的尝试都将失败。

这不是“最佳实践”,而是“必需的实践”。