2014-02-11 46 views
1

我最近開始使用Symfony2-Doctrine2。我沒有得到如何在inheritance mapping中保存數據。正確的Symfony-doctrine繼承映射

我的要求:

對於學習練習:

  • 我正在測試庫應用程序(要求不太現實)。
  • 在高層次上,圖書館可能會包含許多不同類型的項目,例如書籍,文章,手冊等。
  • 它們有一些常見的字段,如名稱,發佈年份等,以及一些項目特定的細節,如書有IDBN,發佈者;手冊有公司,產品。
  • 再一次讓問題變得更復雜一點,還有另外一個'item_content'表有不同的語言描述。

要快速可視化,我以下結構:

enter image description here

我上述結構按教義文檔實現了inheritance mapping & Bidirectional one to many relation

我的問題:如何保存數據使用Symfony2(我已經運行了正確的路由/動作,只需要在控制器中寫入代碼或者在存儲庫中更好地寫入代碼)。在保存數據(比如手動)時,我想將數據保存在Item,Manual和ItemContect表中,但由於數據庫中的discr字段而變得混淆。我沒有在上述結構中找到保存數據的代碼。 我不需要完整的代碼,只需少量提示即可。我的項目類是如下(其他類有作爲學說文檔提到的適當逆):

/** 
* Article 
* 
* @ORM\Table(name="item") 
* @ORM\Entity(repositoryClass="Test\LibraryBundle\Entity\ItemRepository") 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="discr", type="string") 
* @ORM\DiscriminatorMap({"book" = "Book", "manual" = "Manual", "article" = "Article"}) 
*/ 
class Item 
{ 
    //... 

    /** 
    * For joining with ItemContent 
    * 
    * @ORM\OneToMany(targetEntity="ItemContent", mappedBy="item") 
    **/ 
    private $itemContents; 

    public function __construct() 
    { 
     $this->itemContents = new ArrayCollection(); 
    } 

    //... 
} 

回答

2

鑑別場將由主義

$em = $this->getDoctrine()->getManager(); 
$item = new Manual(); // discr field = "manual" 
$itemContent = new ItemContent(); 

$item->addItemContent($itemContent); 
$itemContent->setItem($item); 

$em->persist($item); 
$em->persist($itemContent); 
$em->flush(); 

自動填入的是,答案你等待?

+0

謝謝@VBee啊是的,我的壞。沒有考慮'$ item = new Manual();'我爲Item和Manual創建了單獨的對象。 但是這引發了另一個疑問,我不想在控制器中編寫代碼,而是編寫代碼庫。所以'$ item = new Manual();'屬於哪裏? ItemRepository或ManualRepository。 –

+1

ManualRepository不存在,最好的做法是創建一個自定義實體管理器(如https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Model/UserManager.php)。我建議你第一次把這個邏輯放在你的控制器裏。 – VBee

+0

對不起,您可以創建ManualRepository,但我的建議是相同的,請僅使用存儲庫來提取數據。 – VBee