【问题标题】:Doctrine and Symfony2 multiple manytomany referencesDoctrine 和 Symfony2 多个多对多引用
【发布时间】:2012-04-05 20:43:55
【问题描述】:

这是我的问题。我的捆绑包中有几个实体。我正在尝试制作一个捆绑包来管理电影。但是,在某些情况下,演员也可以是导演,反之亦然。所以我把他们命名为“艺术家”。然后,在每部电影中,在电影实体中,我想指定一对“艺术家”作为导演,一对作为演员,一对作为剧本/作家。但是,我无法通过多对多关系多次引用 Artist 实体。这是我正在尝试做的事情:

/**
 * @ORM\Entity
 * @ORM\Table(name="movies")
 */
class Movie
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $title;

    /**
     * @ORM\Column(type="string", length=100)
     */
    protected $image;

    /**
     * @ORM\ManyToOne(targetEntity="Artist", inversedBy="movies")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    protected $actors;

    /**
     * @ORM\ManyToOne(targetEntity="Artist", inversedBy="movies")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    protected $directors;

    /**
     * @ORM\ManyToOne(targetEntity="Artist", inversedBy="movies")
     * @ORM\JoinColumn(name="category_id", referencedColumnName="id")
     */
    protected $writers;

如何避免这个问题?

【问题讨论】:

    标签: php orm symfony doctrine


    【解决方案1】:

    您可以使用另一个类来表示电影中人物的角色。

    class MovieRole 
    {
    
        // many-to-one with Movie
        protected $movie;
    
        // many-to-one with Artist
        protected $artist;
    
        // string, role of the artist
        protected $role;
    
    }
    

    更新:

    因此,通过这种方式,您的实体会变成这样:

    电影:

    class Movie 
    {
    
        protected $id;
    
        protected $name;
    
    }
    

    艺术家:

    class Artist 
    {
    
        protected $id;
    
        protected $name;
    
    }
    

    艺术家实体和电影实体互不了解,MovieRole 实体加入了两者。

    当您向电影添加导演时,您会保留一个 MovieRole 实体,其中包含相关的电影实体、艺术家实体和“导演”作为角色。如果你想给一个艺术家另一个角色,坚持另一个 MovieRole 具有相同电影和艺术家的实体,并写下角色。或者,如果您想添加另一个导演,请将另一个 MovieRole 实体与同一部电影、新导演和“导演”作为角色持久化。

    当你想查找电影的导演时,以电影和角色为参数查询MovieRole实体。或者如果你想找到一个艺术家的所有角色,查询MovieRole实体,以艺术家为参数。

    【讨论】:

    • 为什么是多对一?如果一个演员在一部电影中有多个角色(即同时导演和表演)怎么办?我相信有些演员已经做到了。那将是多对多???
    • 这不是电影实体。这是用于连接两个实体的实体,就像您使用多对多时生成的一个学说一样。通过这种方式,您拥有了一个电影实体、一个角色实体和一个加入它们的实体。当您想将艺术​​家添加到电影中时,您可以持久化这个实体 (MovieRole),添加相关的电影、艺术家和角色。电影实体和角色实体彼此不知道,只有这张表在它们之间建立了联系。这样一来,您就可以根据需要将艺术家添加到同一部电影中。
    • 为什么是多对一呢?因为任何艺术家都可以有一个角色,但一个角色只能由一个艺术家担任?我理解正确吗?
    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多