2014-10-07 94 views
0

我有以下:学说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

你为什么在User类有一个额外的'$ GRP_ID'? – andy 2014-10-07 12:54:35

+0

其他?我只有一个'$ GRP_ID'来匹配用户组 – kitensei 2014-10-07 13:04:02

+0

您已经通过@ORM \ JoinColumn(name =“GRP_ID”,referencedColumnName =“GRP_ID”)在'$ group'中指定了'GRP_ID'。至于代理,它会根据需要自动加载相应的实体。例如,尝试'$ data-> getGroup() - > getCode()'。 – andy 2014-10-07 13:43:31

回答

0

你不需要$ GRP_ID在用户实体 - 它已经与$组关系映射。 Doctrine自动处理ID。 你的命名约定看起来有点奇怪。通常你应该使用lowe-camel-case(为了避免奇怪的错误)

例如: $ USR_CODE应该是$ usrCode - >以匹配你的getter/setter:setUsrCode(),getUsrCode()。

只是注意到:你没有任何setter。你必须定义setter方法的属性,与命名,约定(看我上面的例子)

编辑: 你可以映射与学说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映射原则到一个旧的oracle数据库,无法编辑,所以我只是想调整我的代码到现有的数据库。 Hydrator需要安装者?因为理想情况下我宁愿不实施它们,因为我使用的视图不能被推送 – kitensei 2014-10-07 13:20:13

+0

看看我的编辑 – Sepultura 2014-10-07 13:25:52

+0

确定编辑(您可以在编辑中看到我的代码),但我仍然可以获取代理而不是对象,即使我将负载设置为EAGER而不是LAZY,所以我猜想问题来自于关系查询,检索了一些未在我的代码中声明的列,我有点丢失:/ – kitensei 2014-10-07 13:38:04