是的,这是正常的。可悲的是,鉴别器列是由数据库方面的Doctrine使用,因此它不能在您的实体中访问。有两种可能的方式来实现你想要什么:
首先,使用儿童类名:
/**
* Article
*
* @ORM\Table(name="article")
* @ORM\Entity(repositoryClass="PM\PlatformBundle\Repository\ArticleRepository")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="media", type="string")
* @ORM\DiscriminatorMap({"article" = "Article", "movie" = "Movie", "image" = "Image"})
*/
class Article
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255)
*/
private $title;
//...
/**
* Get article type.
*
* @return string
*/
public function getType()
{
// This will return "movie" or "image"
return strtolower(substr(strrchr(get_class($this), "\\"), 1));
}
}
/**
* Movie
*
* @ORM\Entity
*/
class Movie extends Article
{
/**
* @var string
*
* @ORM\Column(name="url", type="text")
*/
private $url;
//getter setter
}
/**
* Image
*
* @ORM\Entity
*/
class Image extends Article
{
/**
* @var string
*
* @ORM\Column(name="path", type="string", length=255)
*/
private $path;
//getter setter
}
第二,在你的类声明手动类型:
/**
* Article
*
* @ORM\Table(name="article")
* @ORM\Entity(repositoryClass="PM\PlatformBundle\Repository\ArticleRepository")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="media", type="string")
* @ORM\DiscriminatorMap({"article" = "Article", "movie" = "Movie", "image" = "Image"})
*/
class Article
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255)
*/
private $title;
/**
* @var string
*/
protected $type;
//...
/**
* Get article type.
*
* @return string
*/
public function getType()
{
return $this->type;
}
}
/**
* Movie
*
* @ORM\Entity
*/
class Movie extends Article
{
/**
* @var string
*
* @ORM\Column(name="url", type="text")
*/
private $url;
public function __construct()
{
$this->type = 'movie';
}
//getter setter
}
/**
* Image
*
* @ORM\Entity
*/
class Image extends Article
{
/**
* @var string
*
* @ORM\Column(name="path", type="string", length=255)
*/
private $path;
public function __construct()
{
$this->type = 'image';
}
//getter setter
}
Personnaly,我有一个pr参考第一个解决方案。我发现它更清洁,更具演化性(如果您必须添加第三种文章类型,此代码将适应)。
当然,您也可以使用instanceof
来确定哪个子类是您正在操作的Article实体。
感谢您的帮助,但我已经在我的模板中直接为测试文章类型创建了自己的树枝扩展,现在它完美地工作!不需要手动声明类型或其他方法。 –
这是另一种方式来做到这一点!我很高兴你达到了你想要的。 :) – Boulzy
我回到了这里,目前我正在通过表单添加新文章。我很困惑。看这里http://stackoverflow.com/questions/39791247/build-form-with-single-table-inheritance –