2016-08-16 84 views
2

我有许多对用户和组之间的关系,但是当我想访问用户的所有组时,我会得到空集合。学说2 - ManyToMany关系 - 空集合

namespace LoginBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* @ORM\Entity 
* @ORM\Table(name="User") 
*/ 
class User 
{ 
    /** 
    * @ORM\Column(type="integer", name="id") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $_iId; 

    /** 
    * @ORM\Column(type="string", name="login", length=45) 
    */ 
    private $_sLogin; 

    /** 
    * @ORM\ManyToMany(targetEntity="GroupBundle\Entity\Group", inversedBy="_aUser") 
    * @ORM\JoinTable(name="Group_x_User", 
    *  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="group_id", referencedColumnName="id")} 
    *  ) 
    */ 
    private $_aGroup; 

    public function __construct() { 
     $this->_aGroup = new ArrayCollection(); 
    } 

    /** 
    * Get iId 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->_iId; 
    } 

    /** 
    * Set sLogin 
    * 
    * @param string $sLogin 
    * 
    * @return User 
    */ 
    public function setLogin($sLogin) 
    { 
     $this->_sLogin = $sLogin; 

     return $this; 
    } 

    /** 
    * Get sLogin 
    * 
    * @return string 
    */ 
    public function getLogin() 
    { 
     return $this->_sLogin; 
    } 

    public function getGroups() 
    { 
     return $this->_aGroup; 
    } 

用户和组使用Group_x_User表来存储它们的关系。

namespace GroupBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* @ORM\Entity 
* @ORM\Table(name="Group") 
*/ 
class Group 
{ 
    /** 
    * @ORM\Column(type="integer", name="id") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $_iId; 

    /** 
    * @ORM\Column(type="string", name="name", length=45) 
    */ 
    private $_sName; 

    /** 
    * @ORM\ManyToMany(targetEntity="LoginBundle\Entity\User", mappedBy="_aGroup") 
    */ 
    private $_aUser; 

    public function __construct() { 
     $this->_aUser = new ArrayCollection(); 
    } 

    /** 
    * Get iId 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->_iId; 
    } 

    /** 
    * Set sName 
    * 
    * @param string $sName 
    * 
    * @return Group 
    */ 
    public function setName($sName) 
    { 
     $this->_sName = $sName; 

     return $this; 
    } 

    /** 
    * Get sName 
    * 
    * @return string 
    */ 
    public function getName() 
    { 
     return $this->_sName; 
    } 

    public function getUsers() 
    { 
     return $this->_aUser; 
    } 
} 

对于从数据库恢复数据我使用的代码:

$oUser = $this->getDoctrine() 
     ->getRepository('LoginBundle:User') 
     ->find(2); 
$aGroup = $oUser->getGroups(); 

可惜的是$ aGroup集合包含0个元素的阵列,而在数据库是被匹配的记录。我在映射中缺少什么?

回答

0

您的User类缺少一些东西。您只能使用ArrayCollection来声明_aGroup。这还不够。您必须将数据存储到ArrayCollection

将此添加到User类中。

public class addGroups(\GroupBundle\Entity\Group $group) 
{ 
    $group->addUsers($this); 
    $this->_aGroup->add($group); 
} 

这是用于Group类。

public class addUsers(\LoginBundle\Entity\User $user) 
{ 
    if (!$this->_aUser->contains($user)) { 
     $this->_aUser->add($user); 
    } 
} 

欲了解更多信息,你可以访问这个link

+0

可能你的意思是公共职能。我已经将这个函数添加到两个类中,但仍然是集合是空的。 – Beacze

0

用户:: $ _ aGroup定义上的@ORM \ JoinTable()注释语法旨在用于自引用关系Doctrine documentation

尝试使用简化的语法:

​​

如果使用共同的规范(“ID”为标识的列名,依此类推)学说和Symfony的将完成剩下的为您服务。