2011-08-12 19 views
50

Tengo dos clases de modelo PHP denominadas Category y Item. Una Categoría puede tener muchos Elementos y un Artículo puede pertenecer a muchas Categorías. He creado una relación ManyToMany a ambas clases:Symfony2-Doctrine: la relación ManyToMany no se guarda en la base de datos

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

Y:

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

Ahora en mi controlador:

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

En esta página, se muestra la lista de todos los artículos en un campo selecto El usuario puede seleccionar un elemento y agregarlo a la categoría.

La lista de elementos que pertenecen a la categoría se muestran debajo del formulario.

Cuando presento el formulario, el elemento seleccionado se agrega a la lista de Artículos de categoría, y se muestra a continuación, pero no se almacena en la base de datos, y si actualiza la página, desaparece.

¿Alguien puede ayudarme con esto? Gracias de antemano.

+0

Por encima de correos me ayuda mucho para mapear muchos a muchos mapeo en la Entidad. ¿Existe algún enlace de documentación bueno (completo) que muestre todo tipo de asignación de base de datos (correlaciones de entidades)? – Kiran

Respuesta

83

Su entidad de categoría es la inverse side de la relación.

intente cambiar addItems a tener este aspecto:

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

Tenga en cuenta que he cambiado sus nombres en plural a singular, ya que está tratando con entidades individuales, no colecciones.

+2

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

+15

Me tomó algunas horas de investigación, pero cuando esto sucede en un Formulario, también debe establecer ''by_reference' => false' en los campos de formulario correspondientes. De lo contrario, nunca se invocan los métodos add * y remove *. – spackmat

+0

Y no haga lo que hice: no agregue este método en ambos lados o las entidades buclearán hasta que se reinicie su servidor ... – Leogout

2

que tenían los mismos problemas ... creo que se le olvidó

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

No no es necesario 'persist()' porque ambas entidades ya están administradas –

Cuestiones relacionadas