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

Bla*_*sad 5 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();
}
Run Code Online (Sandbox Code Playgroud)

我可以阅读Doctrine的最佳实践 ......这样做是一种很好的做法.

但问题是:兴趣什么?

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

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

想象一下CarOneToMany中的实体Wheel(不可为空)和OneToMany Passenger(可为空).我应该只$wheels对两者进行初始化吗?为什么?

Cer*_*rad 6

教义实体只是普通对象。当您从数据库加载实体时,Doctrine 从不调用构造函数并负责设置您的集合。不是真正的延迟加载,但 Doctrine 将确保创建集合。这就是为什么您没有注意到差异的原因。

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

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

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

  • 更新显示 Car 实体的问题,尤其是在声明轮子和 addWheel/getWheels 方法的地方。 (2认同)