20

在我的 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

4 回答 4

26

你离那里很近。对于教义多对多关系,您需要同时调用两个 add 方法

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

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

这应该可以解决问题。在文档中他们这样做了,但不要太明确地提及它。不知道为什么,因为很多人都遇到了这个问题(包括我自己)。

于 2013-01-04T15:12:37.360 回答
9

正如这里所解释的,只有拥有方负责连接管理: http ://doctrine-orm.readthedocs.org/en/latest/reference/association-mapping.html#owning-and-inverse-side-on-a -多对多关联

所以只有

$user->addFavorite($favorite);

应该坚持,而不是

$favorite->addUser($user);
于 2015-02-23T09:40:54.207 回答
0

正如 Cedric 所指出的,为多对多关系添加记录仅在一个方向上完成,这取决于您如何定义关系:添加只能由关系的父实体完成,因此在您的情况下,您必须使用:

$user->addFavorite($favorite);
于 2016-04-22T13:07:19.733 回答
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;
于 2017-02-28T13:28:34.410 回答