2016-01-24 4 views
0

Symfony 3 с доктриной.Аннотация базы данных с доктриной

У меня есть пакет «MainBundle», который существует в нескольких проектах Symfony (P1, P2 и P3). MainBundle содержит различные объекты, например «AbstractColor.php».

/*** AbstractColor.php ***/ 

/** 
* @ORM\Entity 
* @ORM\Table(name="color") 
*/ 
class AbstractColor 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="string", length=7) 
    */ 
    protected $code; 

    /* ... getter and setter ... */ 
} 

Я хочу использовать цвет лица в P1, P2 и P3, но в Р3 я хочу, чтобы добавить новое поле «имя». Для этого я создать новый объект в P3 "color.php":

/*** Color.php ***/ 

/** 
* @ORM\Entity 
* @ORM\Table(name="color") 
*/ 
class Color extends \MainBundle\AbstractColor 
{  
    /** 
    * @ORM\Column(type="string", length=100) 
    */ 
    protected $name; 

    /* ... getter and setter ... */ 
} 

P3 Структура файла:

  • приложение
  • бин
  • ЦСИ
    • P3Bundle
      • Сущность
        • color.php
  • вар
  • поставщик
    • MainBundle
      • Сущность
        • AbstractColor.php

Моя проблема

Код выше не работает, потому что я определить таблицу "цвет" несколько раз. Я также пробовал доктрины «Mapped Superclass», но тогда я не могу использовать ассоциации OneToMany.

Есть ли хороший способ решить мою проблему? Спасибо!

ответ

1

Использование Single Table Inheritance вместо MappedSuperclass, проверьте здесь для документации: http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#single-table-inheritance

В принципе, изменить аннотации к вашему AbstractColor:

/** 
* @Entity 
* @InheritanceType("SINGLE_TABLE") 
* @DiscriminatorColumn(name="type", type="string") 
* @DiscriminatorMap({"AbstractColor" = "AbstractColor", "Color" = "Color"}) 
*/ 
class AbstractColor 

Таким образом, столы не будут мешать, и вы будете иметь столбца «type» в вашей таблице «color», который позволит Doctrine узнать, является ли объект экземпляром AbstractColor или Color.

О, и, кстати, ваш класс AbstractColor не является абстрактным вообще, это было довольно тревожно вначале. Возможно, вы захотите переименовать его или сделать его абстрактным.:)

Смежные вопросы