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 将创建链接UserRole 实体的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 模式合并

原则 2:如何更新一对一的双向

Django下orm学习 一对多

原则 3:一对一的单向关系不会返回所有字段

致命错误:调用未定义的方法 MyModule\Entity\MyEntity::findAll() 学说 orm 2 zf2