2015-02-10 193 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