2014-10-07 2 views
0

У меня есть следующие:Doctrine 2 один-ко-многим

У пользователя есть одна группа, группа может иметь множество пользователей

Пользователь

 <?php namespace Application\Model; 

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

/** 
* User model 
* Read-only entity 
* @ORM\Table(name="VLOGGER_WEBCALENDAR_USR") 
* @ORM\Entity 
* @package Application\Model 
*/ 
class User 
{ 
    /** 
    * @var int 
    * @ORM\Id 
    * @ORM\Column(name="USR_ID", type="integer") 
    */ 
    protected $id; 

    /** 
    * @var string 
    * @ORM\Column(name="USR_LOGIN", type="string") 
    */ 
    protected $login; 

    /** 
    * @var string 
    * @ORM\Column(name="USR_CODE", type="string") 
    */ 
    protected $code; 

    /** 
    * @var int 
    * @ORM\Column(name="GRP_ID", type="integer") 
    */ 
    protected $groupId; 

    /** 
    * @var string 
    * @ORM\Column(name="GRP_CODE", type="string") 
    */ 
    protected $groupCode; 

    /** 
    * @var User\Group 
    * @ORM\ManyToOne(targetEntity="Application\Model\User\Group",fetch="EAGER") 
    * @ORM\JoinColumn(name="GRP_ID", referencedColumnName="GRP_ID") 
    */ 
    protected $group; 

    /** 
    * @var Event 
    * @ORM\OneToMany(targetEntity="Application\Model\Event", mappedBy="user") 
    * @ORM\JoinColumn(name="USR_ID", referencedColumnName="USR_ID") 
    */ 
    protected $events; 

    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 
     $this->events = new Collections\ArrayCollection(); 
    } 

    /** 
    * @return string 
    */ 
    public function getCode() 
    { 
     return $this->code; 
    } 

    /** 
    * @param string $code 
    * @return User 
    */ 
    public function setCode($code) 
    { 
     $this->code = $code; 
     return $this; 
    } 

    /** 
    * @return Event 
    */ 
    public function getEvents() 
    { 
     return $this->events; 
    } 

    /** 
    * @param Event $events 
    * @return User 
    */ 
    public function setEvents($events) 
    { 
     $this->events = $events; 
     return $this; 
    } 

    /** 
    * @return User\Group 
    */ 
    public function getGroup() 
    { 
     return $this->group; 
    } 

    /** 
    * @param User\Group $group 
    * @return User 
    */ 
    public function setGroup($group) 
    { 
     $this->group = $group; 
     return $this; 
    } 

    /** 
    * @return string 
    */ 
    public function getGroupCode() 
    { 
     return $this->groupCode; 
    } 

    /** 
    * @param string $groupCode 
    * @return User 
    */ 
    public function setGroupCode($groupCode) 
    { 
     $this->groupCode = $groupCode; 
     return $this; 
    } 

    /** 
    * @return int 
    */ 
    public function getGroupId() 
    { 
     return $this->groupId; 
    } 

    /** 
    * @param int $groupId 
    * @return User 
    */ 
    public function setGroupId($groupId) 
    { 
     $this->groupId = $groupId; 
     return $this; 
    } 

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

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

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

    /** 
    * @param string $login 
    * @return User 
    */ 
    public function setLogin($login) 
    { 
     $this->login = $login; 
     return $this; 
    } 
} 

Группа

<?php namespace Application\Model\User; 

use Application\Model; 
use Doctrine\Common\Collections; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* User group model 
* Read-only entity 
* @ORM\Table(name="VLOGGER_WEBCALENDAR_GRP") 
* @ORM\Entity 
* @package Application\Model 
*/ 
class Group 
{ 
    /** 
    * @var int 
    * @ORM\Id 
    * @ORM\Column(name="GRP_ID", type="integer") 
    */ 
    protected $id; 

    /** 
    * @var string 
    * @ORM\Column(name="GRP_CODE", type="string") 
    */ 
    protected $code; 

    /** 
    * @var Collections\ArrayCollection 
    * @ORM\OneToMany(targetEntity="Application\Model\User", mappedBy="group") 
    * @ORM\JoinColumn(name="GRP_ID", referencedColumnName="GRP_ID") 
    */ 
    protected $users; 

    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 
     $this->users = new Collections\ArrayCollection(); 
    } 

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

    /** 
    * @param mixed $code 
    * @return Group 
    */ 
    public function setCode($code) 
    { 
     $this->code = $code; 
     return $this; 
    } 

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

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

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

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

Когда я пытаюсь получить отношение из групп, он отлично работает, но когда я выбираю пользователей и пытаюсь получить их группу, Doctrine создает некоторые прокси-объекты, а результат - пустой объект с заполненным ключом отношений.

Может ли кто-нибудь указать мне хорошее направление?

Вот мой код:

$query = $em->createQueryBuilder() 
    ->select('u') 
    ->from('Application\Model\User', 'u'); 

$data = $query->getQuery()->getResult(); 
$data = reset($data); 
var_dump($data->getGroup()); // proxy 

########################### 

$query = $em->createQueryBuilder() 
    ->select('g') 
    ->from('Application\Model\User\Group', 'g'); 

$data = $query->getQuery()->getResult(); 
$data = reset($data); 
var_dump($data->getUsers()); // ok 
+0

Почему у вас есть дополнительный '$ GRP_ID' ​​в классе User? – andy

+0

Дополнительно? У меня есть только один '$ GRP_ID' ​​для сопоставления группы пользователей. – kitensei

+0

. Вы уже указали' GRP_ID' ​​в '$ group' на' @ORM \ JoinColumn (name = "GRP_ID", referencedColumnName = "GRP_ID") '. Что касается прокси-сервера, он автоматически загрузит соответствующий объект по мере необходимости. Например, попробуйте '$ data-> getGroup() -> getCode()'. – andy

ответ

0

вам не нужно $ GRP_ID в пользовательском Сущности - это уже сопоставляются с $ групповой связи. Doctrine обрабатывает идентификаторы автоматически. Также ваше соглашение об именах выглядит немного странно. Как правило, вы должны использовать Lowe-верблюжьей случай (чтобы спасти вас от странных ошибок)

Пример: $ USR_CODE должна быть $ usrCode ->, чтобы соответствовать вашему геттер/сеттер: setUsrCode(), getUsrCode().

только что заметили: у вас нет никаких сеттеров. Вы должны определить сеттер для атрибутов, с именованием-конвенцией (посмотреть на моем примере выше)

Edit: можно отобразить столбец с Doctrine ORM обозначения:

/** 
* 
* @ORM\Column(name="USR_CODE", type="string") 
*/ 
private $usrCode; 

И да, вы нуждаются в установщиках, иначе доктрина не сможет установить значения.

Также необходимо AddUser() и функции RemoveUser() (поскольку пользователь является Collection):

public function addUsers(Collection $users) 
{ 
    foreach($users as $user) 
    { 
     if(! $this->users->contains($user)) 
     { 
      $this->users->add($user); 
      $user->setGroup($this); 
     } 
    } 
} 

public function removeUsers(Collection $users) 
{ 
    foreach($users as $user) 
    { 
     if($this->users->contains($user)){ 
      $this->users->remove($user); 
      $user->setGroup(null); 
     } 
    } 
} 
+0

Я знаю, что соглашение об именах совершенно странно, m, сопоставляя доктрину с старой базой данных оракула, которая не может быть отредактирована, поэтому я просто пытаюсь адаптировать свой код к существующему db. Для гидратора нужны сеттеры?потому что в идеале я бы предпочел не реализовывать их, поскольку я использую представления, которые невозможно перетащить – kitensei

+0

посмотреть на мое редактирование – Sepultura

+0

нормально отредактировано (вы можете увидеть мой код в правлении), но я все равно получаю прокси вместо объектов, даже если Я устанавливаю нагрузку на EAGER вместо LAZY, поэтому я предполагаю, что проблема возникает из запроса отношения, получающего некоторые столбцы, которые не объявлены в моем коде, я немного потерял:/ – kitensei