2013-01-04 72 views
15

在我的Symfony2項目中,我有兩個相關的實體:用戶和收藏夾。他們有多對多的關係。在Symfony2中保存多對多關係到數據庫

我的應用程序的工作原理如下: 在我的樹枝頁面中,我有幾個項目帶有「添加到收藏夾」按鈕。當你點擊按鈕時,我的控制器將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(); 
+0

失敗...?你有錯誤,或者它沒有辦法嗎?如果您有錯誤,請發佈。 – Pierrickouw

回答

23

你接近那裏。對於學說多對多的關係,你需要同時調用兩種方法:

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

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

這應該可以做到。在the docs他們這樣做,但不要太明確提及它。不知道爲什麼要麼因爲很多人遇到了這個(包括我自己)。

+0

它在評論中說:「我試過這個,但是它失敗了」。也許還有一個錯誤...其實,你只需要更新協會的擁有方,所以你的答案的第一行不是強制性的。 – Pierrickouw

+0

當我做 - > $ favorite-> addUser($ user); $ user-> addFavorite($ favorite); $ em-> persist($ favorite); $ em-> persist($ user); $ em-> flush(); 我得到這個錯誤:致命錯誤:調用一個成員函數移動()一個非對象在C:\ XAMPP \ htdocs中\ Symfony13的\ src \土工\ CityTroopersBundle \實體\上線Users.php 我查看了我的代碼,它指的是我根本不會調用的函數。 –

+0

從我可以做出的形式的網址,我更新了您的鏈接到文檔 – Dheeraj

0

像塞德里克表示,爲多對多關係添加記錄僅在一個方向上完成,並且取決於您如何定義關係:添加可以由關係的母公司只是做了,所以你的情況,你必須使用:

$user->addFavorite($favorite); 
0

在你行:

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

name="favorite_id" 

部分指連接表中的列,而

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;