【问题标题】:Multiple level of different kind of inheritance多级不同类型的继承
【发布时间】:2015-08-25 20:29:03
【问题描述】:

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

但是,视频可能因提供商而异(例如 Youtube、Dailymotion 等)。因此,我正在考虑通过SINGLE_TABLE 继承进行另一个继承,适合 Video 表。

但是,当我声明我的实体时,似乎如果我在扩展AbstractMedia 实体的AbstractVideo 实体上添加SINGLE_TABLE 继承注释,则永远不会创建Video 表(也不会检测到) .这是这两个实体的 sn-p :

<?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,但是当我尝试保留某些内容时,它说它不是有效实体。

有什么想法,或者我真的应该避免这么深的继承吗?谢谢

【问题讨论】:

  • Doctrine ORM 目前不支持混合继承

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


【解决方案1】:

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

我们与其他实体一起继承文件,这些实体也被继承。 重要的部分是将继承(扩展)实体添加到鉴别器映射中。

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

【讨论】:

  • 不会有一个 SpecialImage 表然后创建?这是我要避免的
  • 此外,我想区分特定于Image(或在我的情况下为AbstractVideo)实体的列
  • 你是对的。它将创建新表。我很困惑,因为我看到你也有“JOINED”继承类型。似乎您正在混合两种 Ingeritencetypes JOINED 和 SINGLETABLE。我的猜测是这可能是问题所在。
  • 是的,我也这么认为,但多表解决方案(只有joined_tables)不是我想要的,因为视频的子类只依赖于一个字段,另一个基本上是一样的。媒体/视频/文档需要join,因为它们确实有不同的数据,而且两层继承的判别器列也不一样(join的一个依赖type,而另一个依赖@ 987654326@)
【解决方案2】:

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 ...
}

【讨论】:

    猜你喜欢
    • 2010-11-08
    • 2017-10-21
    • 1970-01-01
    • 2022-01-17
    • 2016-10-24
    • 2012-03-30
    • 2017-03-16
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多