首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件存储与理论和symfony 3?

文件存储与理论和symfony 3?
EN

Stack Overflow用户
提问于 2016-09-27 12:26:24
回答 3查看 206关注 0票数 0

我需要帮助创建我的实体,在我的symfony3应用程序中使用原则2:

我希望我的用户可以发布内容如下的文章:

  • 标题
  • 作者
  • 一个唯一的图像(上传文件)
  • 或一部独特的电影($url)

你推荐什么?我应该像这样建立我的文章实体吗?

代码语言:javascript
复制
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 =>,这是一个图像,否则这是一个视频)

或者用一个新的实体“媒体”,比如一对一的关系?

我的案子最好的办法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-09-29 09:50:51

是的,这很正常。遗憾的是,区分器列被用于Doctrine数据库端,因此在您的实体中无法访问它。要实现你想要的,有两种可能的方法:

首先,使用子类名称:

代码语言:javascript
复制
/**
 * 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
}

第二种方法是手动声明类中的类型:

代码语言:javascript
复制
/**
 * 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来确定您正在操作的项目实体是哪个子类。

票数 1
EN

Stack Overflow用户

发布于 2016-09-28 07:40:55

我认为使用Media实体和处理media实体中的媒体类型是最好的方法。

代码语言:javascript
复制
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;
}

另一种方法是使用实体继承为图像和电影提供不同的实体--如果需要的话。

票数 1
EN

Stack Overflow用户

发布于 2016-09-28 20:29:25

好的,我对我的文章类做了一个表继承:

代码语言:javascript
复制
/**
 * 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
}

效果很好!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39724674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档