2017-02-17 1 views
0

Symfony 2.8. 기본 가져 오기 모드를 사용할 때 fetch = "EAGER"를 사용하여 중복 (이유는?)을 반환합니다. 모든 것이 정상입니다.Doctrine ORM, ManyToMany - 지연 가져 오기에서 복제

나는 다음과 같은 개체가 :

/** 
* @ORM\Entity() 
*/ 
class User implements AdvancedUserInterface, \Serializable 
{ 
(...) 
    /** 
    * @ORM\ManyToMany(targetEntity="Role", inversedBy="users") 
    * @ORM\JoinTable(name="user_role", 
    *  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")} 
    *) 
    */ 
    private $role; 

    public function addRole(\WerbeoBundle\Entity\Role $role) 
    { 
     $this->role[] = $role; 

     return $this; 
    } 

    public function removeRole(\WerbeoBundle\Entity\Role $role) 
    { 
     $this->role->removeElement($role); 
    } 

    public function getRole() 
    { 
     return $this->role; 
    } 

역할 :

/** 
* @ORM\Entity() 
*/ 
class Role 
{ 
(...) 
    /** 
    * @ORM\ManyToMany(targetEntity="User", mappedBy="role") 
    */ 
    private $users; 

(... and getters/setters ...) 

지금은 다음 한 테이블 USER_ROLE :

user_id | role_id 
     1 | ADMIN 
     1 | EDITOR 

내가 전화 $ 사용자 -> getRole() 결과를 은

ADMIN 
EDITOR 
EDITOR 
ADMIN 
EDITOR 

이것은 기본 가져 오기 모드 (lazy)를 사용할 때만 twig/컨트롤러에서 발생합니다. fetch = "EAGER"이면 모든 것이 정상입니다.

어떤 아이디어가 잘못 되었나요? 덕분에

+0

당신이 잘못된 결과 (컨트롤러/나뭇 가지)를 달성하는 방법을 보여줍니다 코드를 입력하십시오 추가하기 전에 존재하는지 확인해야합니다. 또한 두 경우 모두 어떤 쿼리가 실행되고 있는지 확인할 수 있습니다. Symfony의 프로파일 러에서이를 확인할 수 있습니다. –

+0

이것은 아마 일종의 세션/직렬화 문제 일 것입니다. 로그인 한 하나의 사용자 개체에만 영향을 미칩니다. 그래서 문제는 다른 곳에서 발생합니다. –

답변

0

당신은 항목이 이미

public function __construct() 
{ 
    $this-role = new \Doctrine\Common\Collections\ArrayCollection() 
} 

public function addRole(\WerbeoBundle\Entity\Role $role) 
{ 
    if(!$this->role->contains($role)){ 
     $this->role->add($role) 
    } 

    return $this; 
} 
+0

해결책이 아닌 것 같지만 다른 곳에 문제가 있습니다. addRole에서 Role duplicates를 확인하기 만해도 중복 된 역할을 가지지 만 실제로 로그인 한 사용자에게만 부여됩니다. 그래서 세션에 저장된 User 객체에 문제가있을 수 있습니다. –

관련 문제