php - 多层次不同类型的继承

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

对于我的项目,我正在尝试使用 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/

相关文章:

javascript - 禁用/删除元素中的默认 !important 声明

javascript - 我的第一个 AJAX 请求遇到了麻烦

Symfony 2 覆盖实体并添加额外属性

php - 为什么复合主键中的列顺序对 Doctrine 很重要?

javascript - 许多集合类型的原型(prototype)

ios - 多级继承的 objective-c [self init]层次结构

php - Zend : How to get view in Bootstrap. php?

python : Multiple Inheritance : Why is instance variable of super's super class is not accessible?

python - 在 Python 中调用所有 __init__ 但一次

java - Bukkit - 从 PHP 文件获取响应