2011-08-12 18 views
50

カテゴリとアイテムという2つのPHPモデルクラスがあります。カテゴリには多くのアイテムがあり、アイテムは多くのカテゴリに属する​​ことがあります。Symfony2-Doctrine:ManyToManyリレーションはデータベースに保存されません

class Category 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Item", mappedBy="categories", cascade={"persist"}) 
    */ 
    private $items; 

    /** 
    * Add items 
    * 
    * @param Ako\StoreBundle\Entity\Item $items 
    */ 
    public function addItems(\Ako\StoreBundle\Entity\Item $items) 
    { 
     $this->items[] = $items; 
    } 

    /** 
    * Get items 
    * 
    * @return Doctrine\Common\Collections\Collection 
    */ 
    public function getItems() 
    { 
     return $this->items; 
    } 
} 

そして:私のコントローラで今

class Item 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Category", inversedBy="items", cascade={"persist"}) 
    * @ORM\JoinTable(name="item_category", 
    * joinColumns={@ORM\JoinColumn(name="item_id", referencedColumnName="id")}, 
    * inverseJoinColumns={@ORM\JoinColumn(name="category_id", referencedColumnName="id")} 
    *) 
    */ 
    private $categories; 

    /** 
    * Add categories 
    * 
    * @param Ako\StoreBundle\Entity\Category $categories 
    */ 
    public function addCategories(\Ako\StoreBundle\Entity\Category $categories) 
    { 
     $this->categories[] = $categories; 
    } 

    /** 
    * Get categories 
    * 
    * @return Doctrine\Common\Collections\Collection 
    */ 
    public function getCategories() 
    { 
     return $this->categories; 
    } 
} 

: 私は両方のクラスに多対多の関係を作成している。このページで

$em = $this->getDoctrine()->getEntityManager(); 

$item = $em->getRepository('AkoStoreBundle:Item')->find($item_id); 
$category = $em->getRepository('AkoStoreBundle:Category')->find($category_id); 

$category->addItems($item); 

$em->flush(); 
// Render the same page again. 

を、私はすべての項目のリストを表示します選択フィールドに入力します。ユーザーは1つの項目を選択してカテゴリーに追加することができます。

カテゴリに属する​​アイテムのリストがフォームの下に表示されます。

フォームを送信すると、選択したアイテムがカテゴリアイテムのリストに追加され、下に表示されますが、データベースに保存されず、ページを更新すると消えます。

誰でもこの手伝いできますか? ありがとうございます。

+0

を忘れてしまったと思います。 すべてのタイプのデータベースマッピング(エンティティマッピング)を示す適切な(完全な)ドキュメンテーションリンクはありますか? – Kiran

答えて

83

カテゴリエンティティは、関係のinverse sideです。あなたは、単一のエンティティではなく、コレクションを扱っているので、私は、単数形にあなたの複数の名前を変更し

public function addItem(\Ako\StoreBundle\Entity\Item $item) 
    { 
     $item->addCategory($this); 
     $this->items[] = $item; 
    } 

注:

は次のように見えるようにaddItemsを変更してみてください。

+2

http://www.doctrine-project.org/docs/orm/2.0/ja/reference/association-mapping.html#picking-owning-and-inverse-side – ziiweb

+15

調査に数時間かかりましたが、これが発生したときフォームでは、対応するフォームフィールドに ''by_reference' => false'も設定する必要があります。それ以外の場合、add *メソッドとremove *メソッドは決して呼び出されません。 – spackmat

+0

そして、私のようにしないでください:このメソッドを両側に追加しないでください。そうしないと、エンティティはサーバーが再起動するまでループします。 – Leogout

2

私は同じ問題を抱えていた...私は私のエンティティの多くのマッピングに多くをマッピングするための多くのことができますあなたはポストの上に

$category->addItems($item); 
$em->persist($category); 
$em->flush(); 
+11

両方のエンティティが既に管理されているため、 'persist()'は必要ありません。 –

関連する問題