2017-07-11 12 views
0

Doctrine 2 ORMを使用してユーザーモデルとチームモデルの多対多の関係を構築しようとしています。Doctrine ORMは多対多関係コレクションを埋めません

手動でクエリを実行すると、データベースのエントリがジョインテーブルに表示されますが、Doctrineは関連するエンティティをロードしないようです。

私はこのようなエンティティを作成しています。

$firstTeam = new Bere\Models\Team; 
    $firstTeam->setTitle("First Team"); 
    $em->persist($firstTeam); 

    $firstUser = new Bere\Models\User; 
    $firstUser->setFirstName("aa"); 
    $firstUser->setMiddleName("ss"); 
    $firstUser->setLastName("dd"); 
    $firstUser->setEmail("bb"); 
    $firstUser->setPhone("qq"); 

    $em->persist($firstUser); 
    $em->flush(); 

    $firstTeam->addUser($firstUser); 
    $em->persist($firstTeam); 
    $em->flush(); 

このようにクエリします。

$u = $em->getRepository(Bere\Models\User::class)->findOneBy(array(
     'email' => 'XXXXXXX' 
    ))->toNamedArray(); 

出力:

{ 
    "id": "xx", 
    "email": "aaa", 
    "phone": "bb", 
    "firstName": "qq", 
    "middleName": "ww", 
    "lastName": "ee", 
    "permissionGroups": {}, 
    "permissions": {}, 
    "teams": [ 
     {} 
    ] 
} 

Team.php

/** 
* Class Team 
* @ORM\Entity 
* @package Bere\Models 
*/ 
class Team implements IJsonModel 
{ 

    /** 
    * @var string 
    * @ORM\Id 
    * @ORM\Column(type="string") 
    * @ORM\GeneratedValue(strategy="CUSTOM") 
    * @ORM\CustomIdGenerator(class="\Bere\Utils\UUIDGenerator") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column 
    */ 
    protected $title; 

    /** 
    * @var Collection|User[] 
    * @ORM\ManyToMany(targetEntity="User", inversedBy="teams", cascade={"all"}, fetch="EAGER") 
    */ 
    protected $users; 

    /** 
    * Team constructor. 
    */ 
    public function __construct() 
    { 
     $this->users = new ArrayCollection(); 
    } 

    public function addUser(User $user) 
    { 
     if ($this->users->contains($user)) 
      return; 

     $this->users->add($user); 
     $user->addTeam($this); 
    } 

    /** 
    * @return string 
    */ 
    public function getId(): string 
    { 
     return $this->id; 
    } 

    /** 
    * @param string $id 
    */ 
    public function setId(string $id) 
    { 
     $this->id = $id; 
    } 


    /** 
    * @return mixed 
    */ 
    public function getTitle() 
    { 
     return $this->title; 
    } 

    /** 
    * @param mixed $title 
    */ 
    public function setTitle($title) 
    { 
     $this->title = $title; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getUsers() 
    { 
     return $this->users->toArray(); 
    } 

    /** 
    * @param Collection $users 
    */ 
    public function setUsers(Collection $users) 
    { 
     $this->users = $users; 
    } 

    public function toNamedArray() 
    { 
     return array(
      "id" => $this->getId(), 
      "title" => $this->getTitle(), 
      "users" => $this->getUsers() 
     ); 
    } 


} 

User.php

namespace Bere\Models; 

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

/** 
* Class User 
* @ORM\Entity 
* @package Bere\Models 
*/ 
class User implements IJsonModel 
{ 

    /** 
    * @var string 
    * @ORM\Id 
    * @ORM\Column(type="string") 
    * @ORM\GeneratedValue(strategy="CUSTOM") 
    * @ORM\CustomIdGenerator(class="\Bere\Utils\UUIDGenerator") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column 
    */ 
    protected $email; 

    /** 
    * @ORM\Column 
    */ 
    protected $phone; 

    /** 
    * @ORM\Column 
    */ 
    protected $firstName; 

    /** 
    * @ORM\Column 
    */ 
    protected $middleName; 

    /** 
    * @ORM\Column 
    */ 
    protected $lastName; 

    /** 
    * @var Collection 
    * @ORM\ManyToMany(targetEntity="PermissionGroup") 
    * @ORM\JoinTable(name="user_permission_groups", 
    *  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="permission_group_id", referencedColumnName="id")} 
    * ) 
    */ 
    protected $permissionGroups; 

    /** 
    * @var Collection 
    * @ORM\ManyToMany(targetEntity="Permission") 
    * @ORM\JoinTable(name="user_permissions", 
    *  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="permission_id", referencedColumnName="id")} 
    * ) 
    */ 
    protected $permissions; 

    /** 
    * @var Collection|Team[] 
    * @ORM\ManyToMany(targetEntity="Team", mappedBy="users", cascade={"all"}, fetch="EAGER") 
    */ 
    protected $teams; 

    /** 
    * User constructor. 
    */ 
    public function __construct() 
    { 
     $this->permissionGroups = new ArrayCollection(); 
     $this->permissions = new ArrayCollection(); 
     $this->teams = new ArrayCollection(); 
    } 

    public function addTeam(Team $team) 
    { 
     if ($this->teams->contains($team)) 
      return; 

     $this->teams->add($team); 
    } 

    /** 
    * @return string 
    */ 
    public function getId(): string 
    { 
     return $this->id; 
    } 

    /** 
    * @param string $id 
    */ 
    public function setId(string $id) 
    { 
     $this->id = $id; 
    } 


    /** 
    * @return mixed 
    */ 
    public function getEmail() 
    { 
     return $this->email; 
    } 

    /** 
    * @param mixed $email 
    */ 
    public function setEmail($email) 
    { 
     $this->email = $email; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getPhone() 
    { 
     return $this->phone; 
    } 

    /** 
    * @param mixed $phone 
    */ 
    public function setPhone($phone) 
    { 
     $this->phone = $phone; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getFirstName() 
    { 
     return $this->firstName; 
    } 

    /** 
    * @param mixed $firstName 
    */ 
    public function setFirstName($firstName) 
    { 
     $this->firstName = $firstName; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getMiddleName() 
    { 
     return $this->middleName; 
    } 

    /** 
    * @param mixed $middleName 
    */ 
    public function setMiddleName($middleName) 
    { 
     $this->middleName = $middleName; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getLastName() 
    { 
     return $this->lastName; 
    } 

    /** 
    * @param mixed $lastName 
    */ 
    public function setLastName($lastName) 
    { 
     $this->lastName = $lastName; 
    } 

    /** 
    * @return Collection 
    */ 
    public function getPermissionGroups(): Collection 
    { 
     return $this->permissionGroups; 
    } 

    /** 
    * @param Collection $permissionGroups 
    */ 
    public function setPermissionGroups(Collection $permissionGroups) 
    { 
     $this->permissionGroups = $permissionGroups; 
    } 

    /** 
    * @return Collection 
    */ 
    public function getPermissions(): Collection 
    { 
     return $this->permissions; 
    } 

    /** 
    * @param Collection $permissions 
    */ 
    public function setPermissions(Collection $permissions) 
    { 
     $this->permissions = $permissions; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getTeams() 
    { 
     return $this->teams->toArray(); 
    } 

    /** 
    * @param mixed $teams 
    */ 
    public function setTeams($teams) 
    { 
     $this->teams = $teams; 
    } 

    public function toNamedArray() 
    { 
     return array(
      "id" => $this->getId(), 
      "email" => $this->getEmail(), 
      "phone" => $this->getPhone(), 
      "firstName" => $this->getFirstName(), 
      "middleName" => $this->getMiddleName(), 
      "lastName" => $this->getLastName(), 
      "permissionGroups" => $this->getPermissionGroups(), 
      "permissions" => $this->getPermissions(), 
      "teams" => $this->getTeams() 
     ); 
    } 

} 

答えて

0

この1

を試してみてください
関連する問題