对于我的项目,我正在尝试使用 Doctrine 的继承特性。我需要代表媒体(通过不同的表格:一张表格用于上传的文档,一张表格用于链接的视频,......等等)。
但是,视频可能因提供商而异(例如 Youtube、Dailymotion 等)。因此,我正在考虑通过 SINGLE_TABLE
继承对 Video 表进行另一项继承。
但是,当我声明我的实体时,似乎如果我在 AbstractVideo
实体上添加 SINGLE_TABLE
继承注释,它扩展了 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
,但是当我尝试保留某些内容时,它说它不是有效实体。
任何想法,或者我真的应该避免这种深度继承吗?谢谢
最佳答案
不太确定这是否正是您所需要的,但这是我使用的生产代码。
我们继承文件,与其他实体一起,那些也被继承。 重要的部分是将继承(扩展)实体添加到鉴别器映射。
/**
* 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
关于php - 多层次不同类型的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30758850/