我需要像这样定义的媒体实体:
类别:
Document = @ORM \ InheritanceType(" SINGLE_TABLE"):
例如,类别:
VIDEO:
PHOTO:
文件:
类别的文档将是Document \ Youtube等的实例......
是否可以使用列作为关联字段和鉴别符进行继承?
答案 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;
}