ZF2 - 使用 ORM 原则进行一对一连接和集合
Posted
技术标签:
【中文标题】ZF2 - 使用 ORM 原则进行一对一连接和集合【英文标题】:ZF2 - Working with a one to one join and collections with ORM Doctrine 【发布时间】:2014-05-03 20:16:35 【问题描述】:我正在尝试加入两个表。我的用户表和我的 user_role_linker 表。
用户表:user_id、name、email...等。 user_role_linker 表:user_id、role_id(这是来自 ZfcUser / BjyAithorize)
我将我的用户列出到一个视图中,并且我想在视图中包含他们的角色。幸运的是,user_role_linker 表使用实际的角色名称作为其 ID,所以我只需要进行一次连接。
有人告诉我要实现这一点,我需要使用“集合”。我已经阅读了Doctrine Manual 中有关集合的所有内容,并且我已经写下了一些代码。但是,我有点不确定如何将它们放在一起。这是我迄今为止所拥有的:
<?php
namespace Administration\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\MApping\OneToOne;
use Doctrine\Common\Collections\ArrayCollection;
/** @ORM\Entity */
class User
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer",name="user_id")
* @OneToOne(targetEntity="UserRole", mappedBy="user_id")
*/
protected $user_id;
/** @ORM\Column(type="integer", name="parent_id") */
protected $parent_id;
/** @ORM\Column(type="string", name="title") */
protected $title;
/** @ORM\Column(type="string", name="name") */
protected $name;
//etc.
//Setters and getters
public function getUserId()
return $this->user_id;
public function setTitle($title)
$this->title = $title;
public function setName($name)
$this->name = $name;
//etc.
//Constructor to setup the collection
/** @OneToOne(targetEntity="UserRole", mappedBy="user_id") **/
private $user_role;
public function __construct()
$this->user_role = new ArrayCollection();
public function getUserRole()
return $this->user_role;
我的 UserRole 实体如下所示:
<?php
namespace Administration\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\MApping\OneToOne;
use Doctrine\Common\Collections\ArrayCollection;
/** @ORM\Entity */
class UserRole
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer",name="user_id")
* @OneToOne(targetEntity="User", mappedBy="user_id"))
*/
protected $user_id;
/** @ORM\Column(type="string", name="role_id") */
protected $role_id;
public function getRoleId()
return $this->role_id;
为了抓住用户,我有一个从控制器调用的函数,我怀疑此时我应该设置集合...
public function getUsers()
return $this->em->getRepository('Administration\Entity\User')->findAll();
根据文档,我应该这样做:
$user_group = new UserRole();
$user = new User();
$user->getUserRole()->add($user_group);
目前我还不能 100% 确定...谁能指出一些教程或工作示例?
干杯
【问题讨论】:
ZF2 - Doctrine ORM, Simple Table Join的可能重复 【参考方案1】:我认为你想要的是多对多关联:一个用户可以有多个角色,一个角色可以分配给多个用户。 Doctrine 将为您创建连接表。
假设你有Role
实体:
用户实体:
/** @ORM\Entity */
class User
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer",name="user_id")
*/
protected $user_id;
/** @ORM\Column(type="integer", name="parent_id") */
protected $parent_id;
/** @ORM\Column(type="string", name="title") */
protected $title;
/** @ORM\Column(type="string", name="name") */
protected $name;
// roles association:
/** @ORM\ManyToMany(targetEntity="Role")
protected $roles;
// getters & setters
public function __construct()
$this->roles = new ArrayCollection();
您不需要UserRole
表。 Doctrine 将创建链接User
和Role
实体的users_roles
表。
然后你给用户添加角色:
$user = new User();
// $role1 and $role2 are instances of Role entity
$user->getRoles()->add($role1);
$user->getRoles()->add($role2);
【讨论】:
以上是关于ZF2 - 使用 ORM 原则进行一对一连接和集合的主要内容,如果未能解决你的问题,请参考以下文章
ZF2 Skeleton 和 Doctrine ORM xml 模式合并
致命错误:调用未定义的方法 MyModule\Entity\MyEntity::findAll() 学说 orm 2 zf2