对于我的项目,我试图使用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
,但是当我尝试保留某些内容时,它表示它不是有效实体。
任何想法,还是我真的应该避免这种深度继承?感谢
答案 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 ...
}