2012-04-05 13 views
0

私の問題です。私はバンドルの中にいくつかのエントリーを持っています。私は映画を管理するためのバンドルを作ろうとしています。しかし、いくつかのケースでは、俳優も取締役になることができ、またその逆も可能です。だから私はそれらを「アーティスト」と名付けました。そして、各ムービー、ムービーエンティティで、私は監督として2人の「アーティスト」を、俳優としては2人、脚本家/脚本家としてカップルを割り当てたいと思います。しかし、ManyToMany関係でArtistエンティティを複数回参照することはできません。ここに私がしようとしているもの:DoctrineとSymfony2複数のmanytomanyの参照

/** 
* @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; 

どうすればこの問題を回避できますか?

答えて

1

別のクラスを使用して、映画内の人の役割を表すことができます。

class MovieRole 
{ 

    // many-to-one with Movie 
    protected $movie; 

    // many-to-one with Artist 
    protected $artist; 

    // string, role of the artist 
    protected $role; 

} 

更新:

だからこのように、あなたのentitesは次のように次のようになります。

映画:

class Movie 
{ 

    protected $id; 

    protected $name; 

} 

アーティスト:

class Artist 
{ 

    protected $id; 

    protected $name; 

} 

アーティストエンティティと映画エンティティdoesnお互いに何かを知っていなければ、MovieRoleエンティティはそれらの2つを結合します。

映画にディレクターを追加すると、MovieRoleエンティティが、関連するムービーエンティティ、アーティストエンティティ、および「ディレクター」をロールとして保持します。アーティストに別の役割を与えたい場合は、同じムービーとアーティストを持つ別のMovieRoleエンティティを保持し、役割を書きます。または、別のディレクターを追加する場合は、別のMovieRoleエンティティを同じムービー、新しいディレクターおよび「ディレクター」をロールとして維持します。

ムービーのディレクターを検索する場合は、ムービーとロールをパラメーターとして使用してMovieRoleエンティティをクエリします。または、アーティストのすべての役割を検索する場合は、アーティストとしてアーティストMovieRoleをクエリします。

+0

なぜ多対1ですか?アクターが映画内で複数の役割を持っている(つまり、演技を指揮し、同時に演技する)場合はどうなりますか?私はいくつかの俳優がこれをしたと信じています。それは次にmanytomanyだろうか??? – user1158667

+0

これは映画エンティティではありません。これは、多対多を使用するときに生成される1つの教訓のように、2つのエンティティを結合するために使用されるエンティティです。この方法で、ムービーエンティティ、ロールエンティティ、およびこのエンティティを結合します。アーティストにムービーを追加する場合は、このエンティティ(ムービーロール)に関連するムービー、アーティスト、およびロールを追加します。ムービーエンティティとロールエンティティは互いを認識せず、このテーブルだけがエンティティとロールエンティティ間を接続します。この方法で、あなたは同じ映画にあなたが好きなだけ多くアーティストを追加することができます。 –

+0

それでなぜ多くの人がいますか?どのアーティストも役割を持つことができますが、1人のアーティストだけが役割を果たしているからです。私はこれを正しく得ていますか? – user1158667