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

标签 php symfony doctrine-orm

我在 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 还是两者都初始化?为什么?

最佳答案

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

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

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

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

关于php - 在构造函数中初始化集合有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28432962/

相关文章:

php - 从日期范围之间的 mysql 表列中选择

php - 从我的网站打印内容的最佳方式

doctrine - 从 DQL 中的子查询中选择

php - 如何将 Symfony 4 与 MSSQL 连接

php - 如何通过 SyliusResourceBundle 使用 Sylius 创建新模型

php - Google Gmail SMTP 设置不允许我使用 PHPMailer 发送电子邮件

php - 仅当字符串不为空时才执行查询

php - Doctrine2/PostgreSQL - 具有可空关系的选择错误

doctrine-orm - 在 Symfony 2 中使用自定义存储库时显示错误?

php - 原则 2,使用外键插入表时出错