我需要帮助创建我的实体,在我的symfony3应用程序中使用原则2:
我希望我的用户可以发布内容如下的文章:
你推荐什么?我应该像这样建立我的文章实体吗?
class Article
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var integer
*
* @ORM\Column(name="author", type="integer")
*/
private $author;
/**
* @var ?
*
* @ORM\Column(name="image", type="?")
*/
private $image;
/**
* @var string
*
* @ORM\Column(name="url_movie", type="string")
*/
private $url_movie;
/**
* @var integer
*
* @ORM\Column(name="media", type="integer")
*/
private $media;
}(在控制器中:如果$media =1 =>,这是一个图像,否则这是一个视频)
或者用一个新的实体“媒体”,比如一对一的关系?
我的案子最好的办法是什么?
发布于 2016-09-29 09:50:51
是的,这很正常。遗憾的是,区分器列被用于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
}就个人而言,我倾向于第一种解决方案。我发现它更干净,更具有进化性(如果您必须添加第三篇文章类型,这段代码就会适应)。
当然,您也可以使用instanceof来确定您正在操作的项目实体是哪个子类。
发布于 2016-09-28 07:40:55
我认为使用Media实体和处理media实体中的媒体类型是最好的方法。
class Article
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
// ...
/**
* @var Media
*
* @OneToOne(targetEntity="Media")
* @ORM\JoinColumn(name="media_id", referencedColumnName="id")
*/
private $media;
}
class Media
{
const TYPE_IMAGE = 'image';
const TYPE_MOVIE = 'movie';
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(type="string")
*/
private $url;
/**
* @var string
*
* @ORM\Column(type="string")
*/
private $type;
}另一种方法是使用实体继承为图像和电影提供不同的实体--如果需要的话。
发布于 2016-09-28 20:29:25
好的,我对我的文章类做了一个表继承:
/**
* 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;
//...
}
/**
* 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
}效果很好!
https://stackoverflow.com/questions/39724674
复制相似问题