web-dev-qa-db-fra.com

Symfony2-Doctrine: la relation ManyToMany n'est pas enregistrée dans la base de données

J'ai deux classes de modèles PHP nommées Catégorie et Élément. Une Catégorie peut avoir plusieurs Éléments et un Élément peut appartenir à plusieurs Catégories. J'ai créé une relation ManyToMany avec les deux classes:

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

Et:

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

Maintenant dans mon contrôleur:

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

Dans cette page, je montre la liste de tous les éléments dans un champ de sélection. L'utilisateur peut sélectionner un élément et l'ajouter à la catégorie.

La liste des articles appartenant à la catégorie est affichée sous le formulaire.

Lorsque je soumets le formulaire, l'élément sélectionné est ajouté à la liste des éléments de catégorie et est illustré ci-dessous, mais il n'est pas stocké dans la base de données et s'il actualise la page, il disparaît.

Quelqu'un peut-il m'aider avec cela? Merci d'avance.

56
Omid Kamangar

Votre entité Catégorie est le côté inverse de la relation.

Essayez de changer addItems pour ressembler à ceci:

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

Notez que j'ai changé votre pluriel en singulier, car vous avez affaire à des entités uniques, pas à des collections.

87
timdev

J'ai eu les mêmes problèmes ... je pense que tu as oublié

$category->addItems($item);
$em->persist($category);
$em->flush();
1
Babu