2012-02-10 14 views
4

私はこれについていくつかの頭痛を覚えているし、私は解決策を見つけることができません。Symfony2とDoctrine ManyToMany realtionship

私は2つのエンティティ持っている:私は1本の映画は、複数のカテゴリとその逆を持ちたいMovie.phpとCategory.php

を。だから私はManyToMany関係を選んだのです。

今、私は不思議です...データベースサイトではどうなりますか? movie_idsをcategory_idsにマップする "中間"のテーブルはありますか?しかし、それは何が起こったかではありません。実際に私の最初の試みは、MovieCategoryエンティティを作成することでした - OneToManyを使用して1つのムービーを複数のカテゴリにマップし、MovieCategoryエンティティでOneToOne接続を作成して、カテゴリエンティティからカテゴリ名を取得しました。しかし、私はそれがうまくいかないと思います、そうですか?

今ここで、私は本当に私はこの上で取得することができます任意の助けに感謝、私はそれが動作するはずだと思うかの私のコードです:

Movie.php

<?php 

/** 
* @ORM\Table(name="movies") 
* @ORM\HasLifecycleCallbacks() 
*/ 

class Movie 
{ 

public function __construct() 
{ 
    $this->categories = new ArrayCollection(); 
} 

/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** @ORM\Column(type="string") */ 
protected $moviename; 

/** 
* @ORM\ManyToMany(targetEntity="Category", mappedBy="movie") 
*/ 
protected $categories; 

} 

Category.php

<?php 

/** 
* @ORM\Table(name="categories") 
* @ORM\HasLifecycleCallbacks() 
*/ 

class Category 
{ 

public function __construct() 
{ 
    $this->movies = new ArrayCollection(); 
} 

/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** 
* @ORM\Column(type="string") 
*/ 
protected $name; 

// ... 

/** 
* @ORM\ManyToMany(targetEntity="Movie", mappedBy="movie", cascade={"persist"}) 
*/ 
protected $movies; 


} 
+0

なぜ映画には多くの種類があることを確認してください?同時に映画は「ホラー」と「ドラマ」になることはできませんが、いずれもそうです。私は映画とカテゴリの多対多の関係が必要とは思わない。ムービーからカテゴリへの多対1で、カテゴリからムービーへの一対多への一致でなければなりません。 – jere

+2

ManyToManyリレーションは、Doctrineが実際にジョインテーブルを作成するため、本当に苦しいことがあります。沢山の魔法が続いている。あなた自身の参加エンティティ(MovieCategory)を作成し、それとOneToMany関係を確立する方が簡単です。特に、結合エンティティに追加の属性をハングアップさせたい場合。 – Cerad

+0

@コーラ:しかし、MovieCategory(または私の場合UserRole)にデータがぶら下がっている必要がない、または欲しくない場合は、「マジック」だけを使用するのは/たくさんです。私はそれが何をしているのか、どのようにしているのかを知っています。私はちょうど注釈コマンドを覚えていない:/ PS:主に有益なメモのためにこのコメントを作る。 (私はたぶん情報を探しているので、人々がこれらのようなコメントをしたときに好きです。) – Rixius

答えて

12

Doctrine docsによれば、このようになります。

// Movie.php 
/** 
* @ORM\ManyToMany(targetEntity="Category", inversedBy="movies") 
* @ORM\JoinTable(name="movies_categories") 
*/ 
protected $categories; 

// ... 

// Category.php 
/** 
* @ORM\ManyToMany(targetEntity="Movie", mappedBy="categories") 
*/ 
protected $movies; 
+0

+1あなたは奇妙な男です。数時間それを理解しようとしました...ありがとう! :) – Mike

+0

私はこのリンクが更新されていると思う:http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#many-to-many-bidirectional –

0

両方の宣言でmappedByに同じ値を使用しています。さらに、使用する値は単数で、複数でなければなりません。これは動作しません。

関連する問題