我在 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 永远不会调用构造函数并负责设置你的集合。不是真正的延迟加载,但 Doctrine 将确保创建集合。这就是您没有注意到差异的原因。
但是,如果您使用“new Entity()”创建新实例,则需要构造函数来初始化您的集合。如果您的集合未初始化,那么您的添加方法将失败。更不用说您的 get 方法了。
无论关系如何,始终初始化所有集合。再一次,如果您不这样做,那么任何访问它们的尝试都将失败。
这不是“最佳实践”,而是“必需的实践”。
关于php - 在构造函数中初始化集合有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28432962/