dongtang1966 2013-10-27 11:54
浏览 29
已采纳

主义实体继承

I have an entity which I want to use as a base class for other entities (unknown at this time) and I need to store relationships in the base entity:

/**
 * @ORM\Entity
 * @ORM\Table(name="CMS_content")
 */
class BaseContent {
    /**
     * @ORM\ManyToOne(targetEntity="BaseContent")
     * @ORM\JoinColumn(name="parent", referencedColumnName="id", unique=false)
     */
    protected $parent;

    /**
     * @ORM\ManyToOne(targetEntity="ContentType")
     * @ORM\JoinColumn(name="content_type", referencedColumnName="id", unique=false)
     */
    protected $contentType;
    ...
};

/**
 * @ORM\Entity
 * @ORM\Table(name="CMS_whateverSpecializedContent")
 */
class WhateverSpecializedContent extends BaseContent {};

I cannot use@ORM\InheritanceType("JOINED") because I want to be able to create arbitrary number of subclasses later without touching the base class. I also need to have the base class in a separate database table so the relationship would make sense.

What other options do I have to manage these kind of structure?

  • 写回答

1条回答 默认 最新

  • duanlei20082008 2013-10-28 19:54
    关注

    Instead of using entity inheritance I ended up using the delegate design pattern. Both Content and BaseContent implements a common interface and the BaseContent delegate the functionality to a joined Content entity.

    Now every subclass of this BaseContent will have a joined Content entity and can be used where an IContent is expected.

    interface IContent {...}
    
    /**
     * @ORM\Entity
     * @ORM\Table(name="CMS_content")
     */
    class Content implements IContent {
        /**
         * @ORM\ManyToOne(targetEntity="BaseContent")
         * @ORM\JoinColumn(name="parent", referencedColumnName="id", unique=false)
         */
        protected $parent;
    
        /**
         * @ORM\ManyToOne(targetEntity="ContentType")
         * @ORM\JoinColumn(name="content_type", referencedColumnName="id", unique=false)
         */
        protected $contentType;
        ...
    };
    
    /**
     * @ORM\Entity
     * @ORM\Table(name="CMS_whateverSpecializedContent")
     */
    class WhateverSpecializedContent extends BaseContent {};
    
    /**
     * @ORM\MappedSuperclass
     */
    abstract class BaseContent implements IContent {
        /**
         * @ORM\OneToOne(targetEntity="Content", cascade={"persist", "merge", "remove"})
         * @ORM\JoinColumn(name="content", referencedColumnName="id", unique=false)
         */
        private $content;
    
        public function implementedMethod() {
            $this->content->implementedMethod();
        }
    };
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计