2011-08-12 54 views
50

我有兩個名爲Category和Item的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. 

在這個頁面中,我將展示所有項目的列表在選擇字段中。用戶可以選擇一個項目,並將其添加到該類別。

屬於該類別的項目列表顯示在窗體下方。

當我提交表單時,所選項目被添加到類別項目列表中,如下所示,但它不存儲在數據庫中,並且如果刷新頁面,它將消失。

任何人都可以幫助我嗎? 在此先感謝。

+0

上述職位幫助我很多很多映射到實體很多映射。 是否有任何可以顯示所有類型的數據庫映射(實體映射)的良好(完整)文檔鏈接? – Kiran

回答

83

您的分類實體是inverse side的關係。

嘗試改變爲addItems看起來像這樣:

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

請注意,我改變了你的複數名奇異,因爲你在處理單個實體,而不是收藏。

+2

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

+15

花了我幾個小時的調查,但是當這種情況發生時在表單中,您還必須在相應的表單域上設置''by_reference'=> false'。否則,add *和remove *方法永遠不會被調用。 – spackmat

+0

不要像我這樣做:不要添加這種方法在雙方或yout實體將循環,直到您的服務器重新啓動... – Leogout

2

我有同樣的問題...我想你忘記了

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

有不需要'堅持()',因爲兩個實體都已經被管理 –