【问题标题】:Saving Many to Many relationship to database in Symfony2在 Symfony2 中保存与数据库的多对多关系
【发布时间】:2012-12-19 00:27:54
【问题描述】:

在我的 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();

【问题讨论】:

  • 失败了...?你有一个错误或者它没有解决问题?如果您有错误,请发布。

标签: database symfony many-to-many save


【解决方案1】:

在你的行中:

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

【讨论】:

    【解决方案2】:

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

    $user->addFavorite($favorite);
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 它在评论中说“我也试过了,但失败了”。也许还有另一个错误......实际上,您只需要更新关联的拥有方,因此您的答案的第一行不是强制性的。
      • 当我这样做时 --> $favorite->addUser($user); $user->addFavorite($favorite); $em->persist($favorite); $em->persist($user); $em->flush();我收到此错误:致命错误:在 C:\xampp\htdocs\Symfony13\src\Geo\CityTroopersBundle\Entity\Users 中的非对象上调用成员函数 move() .php653 行我查看了我的代码,它指的是我根本不调用的函数。
      • 从我可以从 url 中得到的信息,我更新了您到文档的链接
      【解决方案4】:

      正如这里所解释的,只有拥有方负责连接管理: 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-11
        • 1970-01-01
        • 2012-12-26
        • 2020-11-28
        • 1970-01-01
        • 2021-06-05
        相关资源
        最近更新 更多