2015-02-10 191 views
5

我正在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中的实体CarWheel(不能为空)和OneToMany与Passenger(可为空)。我应该只初始化$wheels还是两者?为什么?

+0

假设一个使用你的实体的客户端必须检查零值而不是零个元素的计数,以及其他一些我忽略的原则和行为.... – Matteo 2015-02-10 14:09:58

回答

2

主义实体只是普通的对象。从数据库加载实体时,Doctrine从不调用构造函数并负责设置您的集合。不是真正的惰性加载,但Doctrine将确保创建集合。这就是为什么你没有注意到差异。但是,如果您使用“新实体()”创建新实例,则需要构造函数来初始化您的集合。如果你的集合没有被初始化,那么你的添加方法将会失败。不要提你的get方法。

始终初始化所有集合,而不考虑关系。再一次,如果你不这样做,任何尝试访问它们都将失败。

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

+0

“失败”是什么意思?我试过'$ car = new Car(); $ wheel = new Wheel(); $小车 - > addWheel($轮); var_dump($ car-> getWheels());',这两个构造函数都是空的。我没有看到任何错误,并且var_dump显示了'$ wheel'的预期。 – Blacksad 2015-02-17 10:12:37

+1

更新你的问题,显示你的车实体,特别是你声明车轮和addWheel/getWheels方法的地方。 – Cerad 2015-02-17 13:48:34