【问题标题】:What is the use of initializing collections in the constructor在构造函数中初始化集合有什么用
【发布时间】:2015-02-10 13:31:35
【问题描述】:

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

【问题讨论】:

  • 假设使用您的实体的客户端必须检查 null 值而不是计数零元素,以及我忽略的其他一些教义内容和行为......

标签: php symfony doctrine-orm


【解决方案1】:

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

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

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

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

【讨论】:

  • “失败”是什么意思?我试过$car = new Car(); $wheel = new Wheel(); $car->addWheel($wheel); var_dump($car->getWheels());,两个构造器都是空的。我没有看到任何类型的错误,并且 var_dump 向我显示了 $wheel,正如预期的那样。
  • 更新您的问题以显示您的 Car 实体,尤其是在您声明车轮和 addWheel/getWheels 方法的地方。
猜你喜欢
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多