0

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

我怎样才能避免这个问题?

4

1 回答 1

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实体,以艺术家为参数。

于 2012-04-05T21:08:09.420 回答