2013-04-30 67 views
0

我想問你的幫助,刪除關聯。原則:刪除自引用實體(多對多)

User實體:

class User 
{ 
    ... 

    /** 
    * @ORM\ManyToMany(targetEntity="User", mappedBy="following") 
    **/ 
    private $followers; 

    /** 
    * @ORM\ManyToMany(targetEntity="User", inversedBy="followers") 
    * @ORM\JoinTable(name="friends", 
    *  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="friend_user_id", referencedColumnName="id")} 
    *) 
    **/ 
    private $following; 

我有兩個動作:

簡介:遵循

// followAction 
$entityManager = $this->getDoctrine()->getEntityManager(); 

$me->addFollowing($targetUser); 
$targetUser->addFollower($me); 

$entityManager->persist($me); 
$entityManager->persist($targetUser); 

$entityManager->flush(); 

簡介:取消關注

$entityManager = $this->getDoctrine()->getEntityManager(); 

$me->removeFollowing($targetUser); 
$targetUser->removeFollower($me); 

$entityManager->persist($me); 
$entityManager->persist($targetUser); 

$entityManager->flush(); 

以下過程正在以正確的方式工作,並且我看到適當的記錄friends表。

但是,當我試圖停止關注用戶,我收到異常:

同時使用參數{ 「1」 執行 '(?)INSERT INTO的朋友(USER_ID,friend_user_id)VALUES' 發生異常2, 「2」:10}:

SQLSTATE [23000]:完整性約束衝突:關鍵 '主要'

什麼我做錯了1062重複條目 '2-10'?我試過persist,沒有它,也一樣。也許有一些關聯配置?

回答

0

你的第一個錯誤是2堅持行動,你只需要一個。檢查:

// class User 

public function switchFollowingUser(User $user) 
{ 
    if ($this->following->contains($user)) 
     $this->following->removeElement($user) ; 
    else 
     $this->following->add($user) ; 
} 

,如果你想,但我還挺喜歡這種方式,因爲它是更短的控制器將只是

$follower->switchFollowingUser($user) ; 

提取這種方法爲兩種方法。

第二件事: 你把

$this->following = new ArrayCollection() ; 
$this->followers = new ArrayCollection() ; 

在__construct()?

試試看能否有效。

相關問題