2016-03-03 2 views
4

Я получил следующие схемы UML: enter image description hereSymfony2 абстрактный класс множественное наследование с доктриной

В основном, это начало системы таксономической с некоторыми из них вкладываемый, а некоторые нет. Я начал пробовать сделать 2 слоя абстрактных классов (таксономия и OfferCategory), потому что ни один из них не может использоваться в качестве конечного объекта. Я использовал MappedSuperClass, но я получил следующую ошибку:

[Doctrine\ORM\ORMException]                      
Column name `id` referenced for relation from LCH\CatalogBundle\Entity\HomeOfferCategory towards LCH\CatalogBund  le\Entity\OfferCategory does not exist. 

Моего первичный ключ является идентификатором ...

В более общей точке зрения, что лучше реализация моей схемы предоставляется доктрина?

Спасибо!

EDIT: Я попытался перенести всех членов OfferCategory непосредственно в мой класс RootOfferCategory. Изменяя th targetENtity с обеих сторон, больше не возникает ошибок. Значит, вы не можете самостоятельно ссылаться на отображаемый суперкласс?

Таксономия:

/** 
* Class Taxonomy 
* @package LCH\CatalogBundle\Entity 
* @ORM\MappedSuperclass 
*/ 
abstract class Taxonomy implements TaxonomyInterface 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var string the category name 
    * @ORM\Column(name="name", type="string", length=255) 
    */ 
    protected $name; 
} 

** OfferCategory: **

/** 
* OfferCategory 
* @ORM\MappedSuperclass 
*/ 
abstract class OfferCategory extends Taxonomy 
{ 
    /** 
    * @var OfferCategory the category parent 
    * @ORM\ManyToOne(targetEntity="LCH\CatalogBundle\Entity\OfferCategory",inversedBy="children", cascade={"persist"}) 
    * @ORM\JoinColumn(name="parent_id", referenceColumnName="id") 
    */ 
    protected $parent; 
    /** 
    * @var OfferCategory the children categories 
    *  @ORM\OneToMany(targetEntity="LCH\CatalogBundle\Entity\OfferCategory",mappedBy="parent", cascade={"persist"}) 
    */ 
    protected $children; 
} 

RootOfferCategory

/** 
* RootOfferCategory 
* Represents one root top category 
* @ORM\Table() 
*  @ORM\Entity(repositoryClass="LCH\CatalogBundle\Entity\RootOfferCategoryRepository") 
*/ 
class RootOfferCategory extends OfferCategory 
{ 

} 

ответ

0

К сожалению прибыть после войны.

Из this part документации Doctrine:

отображенного суперкласс не может быть объектом, это не запрос, в состоянии и постоянные отношения, определяемые отображенный суперкласс должны быть однонаправленными (с только стороны имущего).

Это означает, что ассоциации «один-ко-многим» невозможны для сопоставленного суперкласса.
Кроме того, ассоциации Many-To-Many возможны только в том случае, если сопоставленный суперкласс используется только в одном объекте.

Для дальнейшей поддержки наследования необходимо использовать одиночные или объединенные функции наследования таблицы.

+0

Спасибо за ваш ответ, я обнаружил, что при чтении снова документа Doctrine2 ... Тем не менее, есть ли другой способ моделирования моего дела, чтобы сохранить родительское отношение уникальным и не дублировать? – nbonniot

+1

Расширьте сущность (не нужно аннотации '@ORM \ Entity'), а не отображенный суперкласс, дочерние сущности наследуют свойства с их отображением. Я использую простой класс, содержащий только сопоставленный идентификатор, чтобы не записывать его во всех моих сущностях, и он отлично работает с аннотацией объекта или без него, абстрактным или нет ... Доктрина хорошо работает с наследованием классов. – chalasr

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

  • Нет связанных вопросов^_^