2017-02-17 3 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 

Когда я называю $ user-> getRole результат() is

ADMIN 
EDITOR 
EDITOR 
ADMIN 
EDITOR 

Это происходит в ветви/контроллере только при использовании режима выборки по умолчанию (ленивый). Когда fetch = "EAGER", все в порядке.

Любые идеи, что я делаю неправильно? Благодаря

+0

Укажите код, который показывает, как вы достигаете неправильные результаты (контроллер/ветка). Также вы можете проверить, какие запросы выполняются в обоих случаях. Вы можете проверить это в профилировщике Symfony. –

+0

Я заметил, что это, вероятно, какая-то проблема с сеансом/сериализацией - она ​​затрагивает только один объект User - который я вошел в систему. Поэтому проблема в другом месте. –

ответ

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 Я получаю дубликаты ролей, но только для фактически зарегистрированного пользователя. Таким образом, может возникнуть проблема с объектом User, сохраненным в сеансе. –

Смежные вопросы