web-dev-qa-db-ja.com

Symfony2-Doctrine:ManyToMany関係はデータベースに保存されません

CategoryとItemという名前の2つのPHPモデルクラスがあります。カテゴリには多くのアイテムがあり、アイテムは多くのカテゴリに属する​​ことがあります。両方のクラスに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つのアイテムを選択して、カテゴリに追加できます。

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

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

誰でもこれを手伝ってくれますか?前もって感謝します。

56
Omid Kamangar

Categoryエンティティは、リレーションシップの inverse side です。

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

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

コレクションではなく単一のエンティティを扱っているため、複数名を単数形に変更したことに注意してください。

87
timdev

私は同じ問題を抱えていた...あなたは忘れていたと思う

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