Doctrine ORM,ManyToMany - 在懒惰提取上重复

时间:2017-02-17 10:54:25

标签: php symfony doctrine-orm orm doctrine

Symfony 2.8。当使用默认提取模式时,返回重复项(为什么?),使用fetch =" EAGER" - 一切都好。

我有以下对象:

/**
 * @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()时,结果是

ADMIN
EDITOR
EDITOR
ADMIN
EDITOR

仅在使用默认提取模式(延迟)时才会在树枝/控制器中发生这种情况。当fetch =" EAGER"一切都好。

任何想法我做错了什么? 感谢

1 个答案:

答案 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;
}