2016-03-03 226 views
4

多重继承我得到了下面的UML方案: enter image description hereSymfony2的抽象类学说

基本上,它是分类系统的其中一些嵌套的,有的不是开始。 我开始尝试制作2层抽象类(Taxonomy和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. 

我的主键字段是ID ...

在从更普遍的观点,什么是对我的方案提供主义的最好的实现?

谢谢!

编辑:我试着直接在我的RootOfferCategory类中转置所有OfferCategory成员。通过改变双方的目标定位,不会有更多的错误。 含义你不能自引用映射的超类?

分类:

/** 
* 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

映射超不能是一个实体,它不是可查询和由映射超定义的持久关系必须是单向的(只有一个持有端)。

这意味着一对多关联在映射超类上根本不可能。
此外,多对多关联只有在映射超类只用于一个实体的情况下才有可能。目前。

为了进一步支持继承,必须使用单表或继承表继承功能。

+0

感谢您的回答,我发现虽然再次阅读Doctrine2文档......但是,有没有另一种方法来模拟我的情况,以保持父母关系的独特性和不重复? – nbonniot

+1

扩展一个实体(实际上不需要'@ORM \ Entity'注释)而不是映射的超类,子实体将继承其映射的属性。我使用了一个简单的类,它只包含一个映射的标识符,以避免将它写入所有实体中,并且它完美地工作,无论是否带有实体注释,抽象与否......规则与类继承一起工作良好。 – chalasr