学说:在自引用中删除实体(多对多)

Posted

技术标签:

【中文标题】学说:在自引用中删除实体(多对多)【英文标题】:Doctrine: Removing entity in self-referencing (many-to-many) 【发布时间】:2013-04-30 13:58:50 【问题描述】:

我想请你帮忙删除关联。

我的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,没有它,也是一样。也许在关联配置中有些东西?

【问题讨论】:

【参考方案1】:

您的第一个错误是 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() 中?

试试这是否可行。

【讨论】:

以上是关于学说:在自引用中删除实体(多对多)的主要内容,如果未能解决你的问题,请参考以下文章

学说,多对多关系问题

从教义中的多对多自引用实体中获取孩子

Symfony 固定装置和多对多关系(学说)

JPA - 一个实体如何引用多对多关系中涉及的两个其他实体?

实体框架自引用分层多对多

删除多对多实体框架