2015-09-15 117 views
0

處理File實體的最佳方式是什麼,您有多個ManyToOne關係。Symfony:處理文件實體

比方說,我有5個實體與File實體有OneToMany關係。

File.php

/** 
* @ORM\ManyToOne(targetEntity="Entity1", inversedBy="files") 
* @ORM\JoinColumn(name="entity1_id", referencedColumnName="id", nullable=true, onDelete="CASCADE") 
*/ 
private $entity1; 

/** 
* @ORM\ManyToOne(targetEntity="Entity2", inversedBy="files") 
* @ORM\JoinColumn(name="entity2_id", referencedColumnName="id", nullable=true, onDelete="CASCADE") 
*/ 
private $entity2; 

and so one.... 

Entity1.php

/** 
* @ORM\OneToMany(targetEntity="File", mappedBy="entity1" , cascade={"persist", "remove"}, orphanRemoval=true) 
*/ 
protected $images; 

對上述的偉大的事情是getter和setter設置,我能堅持,並自動保存到數據庫中。關係已設置,我可以通過調用$entity1->getFiles()加載文件。

我不喜歡的是每當我想添加另一個具有OneToManyFile的實體時,它會在數據庫中創建一個新列,因此我可能會有10列從其他實體引用Ids。

我想什麼來實現的節省類在class領域的實體,並保存記錄的idid領域,也不知何故仍允許繼續存在,並收集保存工作。

entity_id | class 
------------------------------------------ 
2   | ProjectBundle/Entity/Entity1 
3   | ProjectBundle/Entity/Entity2 

回答

1

根本不需要class字段。

使用Doctrine's inheritance mapping由要從File指所有實體創建一個基類:

/** 
* @ORM\Entity() 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="entityType", type="string") 
* @ORM\DiscriminatorMap({ 
*  "entity1" = "Entity1", 
*  "entity2" = "Entity2" 
* }) 
*/ 
abstract class BaseEntity 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="File", mappedBy="entities" , cascade={"persist", "remove"}, orphanRemoval=true) 
    */ 
    protected $images; 
} 

/** 
* @ORM\Entity 
*/ 
class Entity1 extends BaseEntity 
{ 
    ... 
} 

/** 
* @ORM\Entity 
*/ 
class Entity2 extends BaseEntity 
{ 
    ... 
} 

這種方式可以同時參考Entity1Entity2通過其基類File。當調用getEntities時,Doctrine根據每個實體的鑑別值自動創建適當類的實例。

File

/** 
* @ORM\ManyToMany(targetEntity="Entity", inversedBy="images") 
* @ORM\JoinColumn(name="entity_id", referencedColumnName="id", nullable=true, onDelete="CASCADE") 
*/ 
protected $entities; 

OneToManyManyToOne成爲ManyToMany因爲現在的文件可能有許多實體。

+0

謝謝Genti。我想通了,並使用繼承映射 – user742736

+0

當我嘗試使用findAll或find函數時,是否有原因讓我無法再獲得任何結果? ''result = $ em-> getRespository('File-> findAll()'返回一個空的數組 – user742736

+0

當'entityType'列字段爲空時,它不會返回任何記錄嗎?有沒有辦法讓它返回結果? – user742736