1

我想请你帮忙删除关联。

我的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":2,"2":10} 执行 'INSERT INTO friends (user_id,friend_user_id) VALUES (?, ?)' 时发生异常:

SQLSTATE [23000]:完整性约束违规:1062 键 'PRIMARY' 的重复条目 '2-10'

我究竟做错了什么?我试过有persist没有它,都一样。也许在关联配置中有些东西?

4

1 回答 1

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() 中?

试试这是否有效。

于 2013-04-30T15:49:54.473 回答