2011-12-14 86 views
5

我有一个用户实体。这些用户可以在一起成为朋友。所以我定义了一个引用manyToMany单向关联的自我(因为总会有互惠是友谊,对吗?)。manyToMany导致重复输入错误

在阳明一块我的用户实体

manyToMany: 
    friendList: 
    targetEntity: User 
    joinTable: 
     name: user_friend 
     joinColumns: 
     user_id: 
      referencedColumnName: id 
     inverseJoinColumns: 
     friend_id: 
      referencedColumnName: id 
    cascade: [persist] 

当我打电话$user->addFriendList($friend),以及坚持和冲洗,我有PDOException后:

SQLSTATE [23000]:完整性约束冲突:1062复制条目'1-2'for fey'PRIMARY'

当我检查日志时,我可以看到该教条正在尝试e xectue两次插入相同的查询。

为了您的信息,我的addFriendList功能

public function addFriendList(User $friend) 
{ 
    if (!$this->friendList->contains($friend)) { 
     $this->friendList[] = $friend; 
     $friend->addFriendList($this); 
    } 
} 

如果我错了吗?

回答

4

我终于找到了解决我的问题。但是我仍然不知道它是否是Doctrine2缺陷,或者它是否按设计工作。

我需要添加朋友面前坚持我的用户和冲洗。

所以我的工作代码为:

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

$user->addFriendList($friend); 
$em->persist($user); 
$em->flush(); 
2

@Reuven,你写道:

$this->friendList[] = $friend; 
$friend->addFriendList($this); 

那么,你是两次插入的关系。

这应该是足够了:

$this->friendList[] = $friend; 
1

这是因为你没有指定的mappedBy(持有端)和inversedBy。

退房用户和角色之间的许多一对多的关系:

/** 
* @ORM\Entity 
* @ORM\Table(name="user") 
*/ 
class User 
{ 

    /** 
    * @ORM\ManyToMany(targetEntity="Role", mappedBy="users") 
    * @ORM\JoinTable(name="user_role", 
    *  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")} 
    *) 
    */ 
    protected $roles; 

    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 
     $this->roles = new ArrayCollection(); 
    } 

    /** 
    * Has role 
    * 
    * @param Role $role 
    * @return bool 
    */ 
    public function hasRole(Role $role) 
    { 
     return $this->roles->contains($role); 
    } 

    /** 
    * Add role 
    * 
    * @param Role $role 
    */ 
    public function addRole(Role $role) 
    { 
     if (!$this->hasRole($role)) { 
      $this->roles->add($role); 
      $role->addUser($this); 
     } 
    } 

    /** 
    * Remove roles 
    * 
    * @param Role $role 
    */ 
    public function removeRole(Role $role) 
    { 
     if ($this->hasRole($role)) { 
      $this->roles->removeElement($role); 
      $role->removeUser($this); 
     } 
    } 
} 

/** 
* @ORM\Entity 
* @ORM\Table(name="role") 
*/ 
class Role implements RoleInterface 
{ 

    /** 
    * @ORM\ManyToMany(targetEntity="User", inversedBy="roles") 
    * @ORM\JoinTable(name="user_role", 
    *  joinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")} 
    *) 
    */ 
    private $users; 

    public function __construct() 
    { 
     $this->users = new ArrayCollection(); 
    } 

    /** 
    * Has user 
    * 
    * @param User $user 
    * @return bool 
    */ 
    public function hasUser(User $user) 
    { 
     return $this->users->contains($user); 
    } 

    /** 
    * Add user 
    * 
    * @param User $user 
    */ 
    public function addUser(User $user) 
    { 
     if (!$this->hasUser($user)) { 
      $this->users->add($user); 
      $user->addRole($this); 
     } 
    } 

    /** 
    * Remove user 
    * 
    * @param User $user 
    */ 
    public function removeUser(User $user) 
    { 
     if ($this->hasUser($user)) { 
      $this->users->removeElement($user); 
      $user->addRole($this); 
     } 
    } 

    /** 
    * Get users 
    * 
    * @return ArrayCollection 
    */ 
    public function getUsers() 
    { 
     return $this->users; 
    }