Doctrineの多対多のロジックは私を少し混乱させます。私はレシピとカテゴリーの非常に単純な多対多の関係を持っています。私の基本エンティティクラスも同様に単純です。
レシピエンティティクラス...
class Recipe
{
/**
* @ORM\ManyToMany(targetEntity="Category", inversedBy="categories")
* @ORM\JoinTable(name="recipe_category")
**/
private $categories;
/**
* @var integer
*
* @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;
public function __construct() {
$this->categories = new \Doctrine\Common\Collections\ArrayCollection();
}
}
そして、Categoryエンティティクラス...
class Category
{
/**
* @ORM\ManyToMany(targetEntity="Recipe")
**/
private $recipes;
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
public function __construct() {
$this->recipes = new \Doctrine\Common\Collections\ArrayCollection();
}
}
かなり前向きに見え、Doctrine(およびSymfony2)のドキュメントの例と一致します。Symfonyコンソールアプリを介してこれらのクラスのゲッターとセッターを生成しようとすると、奇妙な動作が発生します。
関係セッター/ゲッターが正しくありません。たとえば、生成されたRecipeクラスのCategoryセッターを例にとってみましょう...
/**
* Add categories
*
* @param \Namespace\CookbookBundle\Entity\Category $categories
* @return Recipe
*/
public function addCategorie(\Namespace\CookbookBundle\Entity\Category $categories)
{
$this->categories[] = $categories;
return $this;
}
メソッド名の自動生成がオフになっているようです。これは「addCategory」であり、「category」を渡す必要があります。
これは手動で修正できますが、エンティティジェネレーターを再実行すると、それらが再度追加されます。
私はこれを間違って行っていますか、それともこれはエンティティジェネレータの単なる癖ですか?アノテーションを介してオーバーライドを指定できますか?