2011-08-12 16 views
50

Mam dwie klasy modelu PHP o nazwie Kategoria i Przedmiot. Kategoria może zawierać wiele przedmiotów, a przedmiot może należeć do wielu kategorii. Stworzyłem relacji ManyToMany do obu klas:Symfony2-Doctrine: Relacja ManyToMany nie jest zapisana w bazie danych

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; 
    } 
} 

I:

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; 
    } 
} 

Teraz w moim kontrolera:

$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. 

na tej stronie, pokazuję listę wszystkich przedmiotów w polu wyboru. Użytkownik może wybrać jeden element i dodać go do kategorii.

Lista przedmiotów należących do kategorii znajduje się pod formularzem.

Po przesłaniu formularza wybrany element zostaje dodany do listy pozycji kategorii i jest pokazany poniżej, ale nie jest przechowywany w bazie danych, a po odświeżeniu strony znika.

Czy ktoś może mi w tym pomóc? Z góry dzięki.

+0

wyżej post pomaga mi dużo do mapowania wiele do wielu mapowania w jednostce. Czy istnieje jakieś dobre (pełne) łącze do dokumentacji, które pokazuje wszystkie typy mapowania baz danych (mapowania encji)? – Kiran

Odpowiedz

83

Twoja encja kategorii to inverse side relacji.

Spróbuj zmienić addItems wyglądać tak:

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

pamiętać, że zmieniła swoje nazwy do pojedynczej liczby mnogiej, ponieważ masz do czynienia z pojedynczymi jednostkami, a nie kolekcjach.

+2

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

+15

Zajęło mi to kilka godzin badań, ale kiedy to się stanie w formularzu należy również ustawić "'by_reference" => false' na odpowiednich polach formularza. W przeciwnym razie metody dodawania * i usuwania * nigdy nie będą wywoływane. – spackmat

+0

I nie rób tak jak ja: nie dodawaj tej metody po obu stronach lub twoje podmioty będą się uruchamiać dopóki twój serwer nie uruchomi się ponownie ... – Leogout

2

miałem te same problemy ... Chyba zapomniałeś

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

nie wymaga 'persist()', ponieważ obie jednostki są już zarządzane –

Powiązane problemy