正确的Symfony-doctrine继承映射

时间:2014-02-11 11:08:18

标签: php symfony doctrine-orm doctrine

我最近开始使用Symfony2-Doctrine2。我没有得到如何在inheritance mapping中保存数据。

我的要求:

学习练习:

  • 我正在制作一个用于测试的库应用程序(要求可能不实用)。
  • 在高级别,图书馆现在可能包含许多不同类型的项目,如书籍,文章,手册等。
  • 他们有一些共同的领域,如名称,发布年份等,一些项目特定的细节,如书有IDBN,出版商;手册有公司,产品。
  • 再次为了使问题变得更复杂,还有另一个'item_content'表可以用不同的语言进行描述。

为了快速可视化,我遵循以下结构:

enter image description here

我根据inheritance mapping&的学说文档实现了上述结构。 Bidirectional one to many relation

我的问题:如何使用Symfony2保存数据(我正确运行路由/操作,只需要在控制器中编写代码或在存储库中编写更好的代码)。在保存数据时(比如手动)我想在Item,Manual和ItemContect表中保存数据,但由于数据库中的discr字段而感到困惑。我没有找到在上述结构中保存数据的代码。 我不需要完整的代码,只需要一些提示就足够了。我的Item类如下所示(其他类具有正确的反向,如doctrine docs中所述):

/**
 * 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();
    }

    //...
}

1 个答案:

答案 0 :(得分:2)

鉴别符字段将由Doctrine

自动填充
$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();

这是你正在等待的答案吗?

相关问题