2011-12-14 39 views
5

Tôi có một thực thể Người dùng. Và những người dùng đó có thể kết bạn với nhau. Vì vậy, tôi đã định nghĩa một tham chiếu tự liên kết đa hướng OneToMany (bởi vì luôn có sự tương hỗ là tình bạn, đúng không?).manyToMany gây ra lỗi nhập trùng lặp

một mảnh thực thể của tôi dùng trong YML

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

Khi tôi gọi $user->addFriendList($friend), và sau một kiên trì và một tuôn ra, tôi có PDOException:

SQLSTATE [23000]: Liêm chính hạn chế vi phạm : 1062 Mục nhập trùng lặp '1-2' cho fey 'PRIMARY'

Khi tôi kiểm tra nhật ký, tôi có thể thấy rằng học thuyết đang cố gắng e xectue cùng một truy vấn chèn hai lần.

Để biết thông tin của bạn, chức năng addFriendList tôi

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

Tôi đang ở đâu sai ở đây?

Trả lời

4

Cuối cùng tôi đã tìm được giải pháp cho vấn đề của mình. Tuy nhiên tôi vẫn không biết nếu đó là một lỗi Doctrine2 hoặc nếu nó hoạt động như thiết kế.

Tôi cần phải duy trì người dùng của mình và tuôn ra trước khi thêm bạn bè.

Vì vậy, mã làm việc của tôi là:

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

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

@Reuven, bạn đã viết:

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

Vâng, bạn đang chèn các mối quan hệ hai lần.

này nên là đủ:

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

Đó là bởi vì bạn đã không chỉ định một mappedBy (sở hữu bên) và inversedBy.

Kiểm tra mối quan hệ này nhiều-nhiều giữa người sử dụng và vai trò:

/** 
* @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; 
    } 
Các vấn đề liên quan