Я получил следующие схемы UML: Symfony2 абстрактный класс множественное наследование с доктриной
В основном, это начало системы таксономической с некоторыми из них вкладываемый, а некоторые нет. Я начал пробовать сделать 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
{
}
Спасибо за ваш ответ, я обнаружил, что при чтении снова документа Doctrine2 ... Тем не менее, есть ли другой способ моделирования моего дела, чтобы сохранить родительское отношение уникальным и не дублировать? – nbonniot
Расширьте сущность (не нужно аннотации '@ORM \ Entity'), а не отображенный суперкласс, дочерние сущности наследуют свойства с их отображением. Я использую простой класс, содержащий только сопоставленный идентификатор, чтобы не записывать его во всех моих сущностях, и он отлично работает с аннотацией объекта или без него, абстрактным или нет ... Доктрина хорошо работает с наследованием классов. – chalasr