继承与协会

时间:2014-06-21 12:49:41

标签: doctrine-orm

我需要像这样定义的媒体实体:

类别:

  • name:string(25)
  • slug:string(25)
  • description:text
  • 文件:与文件相关联

Document = @ORM \ InheritanceType(" SINGLE_TABLE"):

  • 类别:协会(类别)和鉴别器
  • title:string(50)
  • description:text
  • slug:string(50)

例如,类别:
VIDEO:

  • youtube
  • dailymotion
  • vimeo

PHOTO:

  • locale photo
  • 云照片

文件:

  • 语言环境文件
  • 云文件

类别的文档将是Document \ Youtube等的实例......

是否可以使用列作为关联字段和鉴别符进行继承?

1 个答案:

答案 0 :(得分:0)

official documentation似乎没有提及对此的限制。

但是,由于您想要的列是关系,因此鉴别器映射将依赖于DB发布的ID,这在我看来并不好......

但你仍然可以让Doctrine为你处理鉴别器:只声明一个你永远不会直接使用的鉴别器列,声明它的映射,然后依靠实体逻辑来保持类别和文档类型之间的一致性:

/**
 * @ORM\Entity(repositoryClass="...
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap({
 *     "youtube"="Youtube",
 *     "dailymotion"="Dailymotion",
 *     ...
 * })
*/
abstract class Document {

    /**
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="documents")
    */
    protected $category;
    ...
    //this is to be called by children that all share a category field
    public function setCategory(Category $c) {
        $class = get_class($this);
        if (strtolower($c->getName()) !== strtolower(substr($class, strrpos($class, '\\') + 1))) {
            throw new \LogicException("Cannot bind " . $class . " to category " . $c->getName());
        }
        $this->category = $c;
        return $this;
    }