3

对于我的项目,我试图使用Doctrine的继承功能。我需要代表媒体(通过不同的表格:上传文件一张,链接视频一张,等等)。不同类型的继承的多级别

但是,视频可能因供应商不同而不同(例如Youtube,Dailymotion,您将其命名)。所以,我正在考虑通过SINGLE_TABLE继承来做一个适合视频表的另一个继承。

但是,当我宣布我的实体,似乎如果我添加在AbstractVideo实体,它扩展了AbstractMedia实体的SINGLE_TABLE继承批注,则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,但后来当我试图坚持的东西,它说,它不是一个有效的实体。

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

+1

Doctrine ORM – Ocramius

回答

0

As @OCramius said in a comment to my question,这不受Doctrine ORM支持。所以为了做我想做的事情,我会在我的对象的data属性中存储一个值对象,存储“子类”的属性,而不是具有深度不同类型的继承。

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

class Youtube 
{ 
    //public function ... 
} 

class Dailymotion 
{ 
    // public funciton ... 
} 
0

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

我们继承了其他实体的文件,并且这些文件也被继承。 重要的部分是将继承(扩展)实体添加到排除器映射。

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

当前不支持混合继承会不会有一个'SpecialImage'表创建呢?这就是我想要避免 – Talus

+0

此外,我想歧视一个专门针对'Image'(或'AbstractVideo'在我的案例中)实体 – Talus

+0

的列,你是对的。它会创建新的表格。我很困惑,因为我看到你也有“JOINED”继承类型。你似乎混合了两种Ingeritencetypes,JOINED和SINGLETABLE。我的猜测是,这可能是问题所在。 – nakashu