2016-08-16 10 views
2

私はユーザーとグループの間に多くの関係がありますが、ユーザーのすべてのグループにアクセスしたいときは空のコレクションを取得します。Doctrine 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クラスには何かがありません。 で_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

@ORM \ JoinTable()User :: $ _ aのアノテーション構文は、自己参照関係Doctrine documentationに使用するためのものです。

は単純化された構文を使用してみてください:

​​

あなたが共通の規則を使用している場合(識別子の列名として「ID」など)教義とsymfonyはあなたのための残りを行います。

関連する問題