在构造函数中初始化集合有什么用途
问题描述:
我正在Symfony中使用Doctrine,实体生成器会在实体的构造函数中初始化集合。例如:在构造函数中初始化集合有什么用途
/**
* @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
还是两者?为什么?
答
主义实体只是普通的对象。从数据库加载实体时,Doctrine从不调用构造函数并负责设置您的集合。不是真正的惰性加载,但Doctrine将确保创建集合。这就是为什么你没有注意到差异。但是,如果您使用“新实体()”创建新实例,则需要构造函数来初始化您的集合。如果你的集合没有被初始化,那么你的添加方法将会失败。不要提你的get方法。
始终初始化所有集合,而不考虑关系。再一次,如果你不这样做,任何尝试访问它们都将失败。
这不是“最佳实践”,而是“必需的实践”。
假设一个使用你的实体的客户端必须检查零值而不是零个元素的计数,以及其他一些我忽略的原则和行为.... – Matteo 2015-02-10 14:09:58