多级别的不同类型的继承

时间:2015-06-10 14:10:40

标签: php doctrine-orm multiple-inheritance single-table-inheritance

对于我的项目,我试图使用Doctrine的继承功能。我需要代表媒体(通过不同的表:一个表用于上传文档,一个用于链接视频,等等)。

但是,视频因提供商而异(例如Youtube,Dailymotion,您的名字)。所以,我正在考虑通过SINGLE_TABLE继承来进行另一个适用于Video表的继承。

但是,当我声明我的实体时,似乎如果我在SINGLE_TABLE实体上添加了AbstractVideo继承注释,该实体扩展了AbstractMedia实体,Video永远不会创建(也不会检测到)表。以下是这两个实体的片段:

<?php
namespace Acme\Demo\Entity;

use Datetime;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="Media")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 */
abstract class AbstractMedia
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    // some other fields
}

/**
 * @ORM\Entity
 * @ORM\Table(name="Video")
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="provider", type="string")
 * @ORM\DiscriminatorMap({})
 */
abstract class AbstractVideo extends AbstractMedia
{
    /** @ORM\Column(type="string") */
    private $name;

    // some other fields
}

我已经尝试将映射实体扩展到Foo实体,扩展AbstractVideo,但是当我尝试保留某些内容时,它表示它不是有效实体。

任何想法,还是我真的应该避免这种深度继承?感谢

2 个答案:

答案 0 :(得分:0)

不确定这是否正是您所需要的,但这来自我使用的生产代码。

我们与其他实体一起继承该文件,并且这些实体也是继承的。 重要的是将继承(扩展)实体添加到disciminator map。

/**
 * File
 *
 * @ORM\Table(name = "file")
 * @ORM\Entity(repositoryClass="Living\ApiBundle\Entity\File\FileRepository")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string", length=64)
 * @ORM\DiscriminatorMap({
 *      "file"  = "Something\Entity\File\File",
 *      "image" = "Something\Entity\Image\Image",
 *      "specialImage" = "Something\Entity\Image\SpecialImage",
 * })
 */
class File implements FileEntityInterface

.....

/**
 * ImageFile
 *
 * @ORM\Table(name="image")
 * @ORM\Entity(repositoryClass="Living\ApiBundle\Entity\Image\ImageRepository")
 */
class Image extends File implements ImageEntityInterface

答案 1 :(得分:0)

As @OCramius said in a comment to my question,Doctrine ORM不支持此功能。所以要做我想做的事情,我会在我的对象的data属性中存储一个值对象,存储&#34;子类的属性&#34;而不是具有深刻的不同类型的继承。

<?php
class Video extends AbstractMedia
{
    // returns the value object youtube, dailymotion, ... etc
    public function getData();    
}

class Youtube
{
   //public function ...
}

class Dailymotion
{
   // public funciton ...
}