2011-12-14 16 views
5

Mam jednostkę użytkownika. I ci użytkownicy mogą być przyjaciółmi. Tak więc zdefiniowałem samo odniesienie do wielu wielu jednokierunkowych skojarzeń (ponieważ zawsze jest wzajemność przyjaźń, prawda?).manyToany powoduje zduplikowany błąd wpisu

kawałek mojego jednostki użytkownika w yml

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

Kiedy zadzwonić $user->addFriendList($friend) i po przetrwania i rumieniec, mam PDOException:

SQLSTATE [23000]: naruszenia ograniczenia integralności : 1062 Zduplikowany wpis "1-2" dla osoby "PRIMARY"

Kiedy sprawdzam dzienniki, widzę, że doktryna próbuje Wykonaj tę samą kwerendę wstawiania dwa razy.

Dla twojej informacji, mój addFriendList funkcja

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

Gdzie jestem źle tutaj?

Odpowiedz

4

W końcu znalazłem rozwiązanie mojego problemu. Jednak nadal nie wiem, czy jest to wada Doctrine2, czy działa zgodnie z założeniami.

Muszę utrzymywać mojego użytkownika i kolor przed dodaniem przyjaciół.

Więc mój kod robocza wynosi:

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

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

@Reuven, napisałeś:

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

Cóż, wstawiasz zależność dwukrotnie.

To powinno wystarczyć:

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

To dlatego, że nie podać mappedBy (boczny posiadanie) i inversedBy.

Sprawdź to wiele-do-wielu między użytkownikami i funkcje:

/** 
* @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; 
    } 
Powiązane problemy