2014-02-11 76 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