是的,這是正常的。可悲的是,鑑別器列是由數據庫方面的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 –