在Symfony2中保存多对多关系到数据库

时间:2013-01-04 14:47:24

标签: database symfony many-to-many save

在我的Symfony2项目中,我有两个相关的实体:用户和收藏夹。他们有多对多的关系。

我的申请表如下: 在我的Twig页面中,我有一些带有“添加到收藏夹”按钮的项目。当您单击按钮时,我的控制器将item_id保存在“收藏夹”列中。但后来我想保存 将项目添加到他的收藏夹的用户,此处我的应用程序失败。

用户和收藏夹存在但用户和收藏夹之间的连接列仍为空。 我也没有收到任何错误。

这是我的代码:

实体用户

class Users implements AdvancedUserInterface
{
    /**
     * @var \Doctrine\Common\Collections\ArrayCollection
     *
     * @ORM\ManyToMany(targetEntity="Favorites", inversedBy="user", cascade={"persist"})
     * @ORM\JoinTable(name="user_has_favorite",
     *   joinColumns={
     *     @ORM\JoinColumn(name="user_id", referencedColumnName="user_id")
     *   },
     *   inverseJoinColumns={
     *     @ORM\JoinColumn(name="favorite_id", referencedColumnName="favorite_id")
     *   }
     * )
     */
    private $favorite;

    public function __construct()
    {
        $this->favorite = new \Doctrine\Common\Collections\ArrayCollection();
    }

    public function addFavorite(\Geo\CityTroopersBundle\Entity\Favorites $favorite)
    {
        $this->favorite[] = $favorite;

        return $this;
    }
...

实体收藏夹

class Favorites
{

    /**
     * @var \Doctrine\Common\Collections\ArrayCollection
     *
     * @ORM\ManyToMany(targetEntity="Users", mappedBy="favorite", cascade={"persist"})
     */
    private $user;

    public function __construct()
    {
        $this->user = new \Doctrine\Common\Collections\ArrayCollection();
    }
    public function addUser(\Geo\CityTroopersBundle\Entity\Users $user)
    {
        $this->user[] = $user;    
        return $this;
    }

我的控制器

public function showNewsAction()
    {
        $request = $this->get('request');    
        $itemId=$request->request->get('itemId');
        if($itemId != NULL)
        {
        //MAKE NEW FAVORITE AND ADD TO DATABASE LINKED WITH ITEM
        $favorite = new Favorites();
        $favorite->setItemId($itemId);

         //LINK FAVORITE ID WITH USER ID IN JOINCOLUMN
        $userId = 6;
        $em = $this->getDoctrine()->getEntityManager();

        $user = $em->getRepository('GeoCityTroopersBundle:Users')->find($userId);

        $favorite->addUser($user);
        $em->persist($favorite); 

        //I TRIED THIS TOO, BUT IT FAILED
        /*$user->addFavorite($favorite);
        $em->persist($user);*/

        $em->flush();

4 个答案:

答案 0 :(得分:24)

你在那附近。对于doctrine多对多关系,您需要调用两个add方法

$favorite->addUser($user);
$user->addFavorite($favorite);

$em->persist($favorite); 
$em->persist($user);
$em->flush();

这应该可以解决问题。在the docs他们这样做,但没有明确提及。不确定为什么会因为很多人遇到这种情况(包括我自己)。

答案 1 :(得分:8)

如此处所述,只有拥有方负责连接管理: http://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html#owning-and-inverse-side-on-a-manytomany-association

所以只有

$user->addFavorite($favorite);

应该坚持,而不是

$favorite->addUser($user);

答案 2 :(得分:0)

如同Cedric所指出的那样,添加多对多关系的记录只能在一个方向上完成,这取决于你如何定义关系:只能通过关系的父实体进行添加,所以在你的情况下你必须使用:

"C:\Windows\System32"

答案 3 :(得分:0)

在你的行中:

@ORM\JoinColumn(name="favorite_id", referencedColumnName="favorite_id")

name="favorite_id"

part指的是连接表中的列,而

referencedColumnName="favorite_id"

指的是喜欢的表中的id,通常只是“id”。你应该试试:

    /**
 * @var \Doctrine\Common\Collections\ArrayCollection
 *
 * @ORM\ManyToMany(targetEntity="Favorites", inversedBy="user", cascade={"persist"})
 * @ORM\JoinTable(name="user_has_favorite",
 *   joinColumns={
 *     @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 *   },
 *   inverseJoinColumns={
 *     @ORM\JoinColumn(name="favorite_id", referencedColumnName="id")
 *   }
 * )
 */
private $favorite;