ZF2 - 使用ORM Doctrine进行一对一的连接和集合

时间:2014-05-03 20:16:35

标签: orm doctrine-orm zend-framework2

我正在尝试加入两个表格。我的用户表和我的user_role_linker表。

用户表:user_id,名称,电子邮件......等 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%肯定...有人能指点我的一些教程或工作示例吗?

干杯

1 个答案:

答案 0 :(得分:0)

我认为你想要的是多对多关联:一个用户可以有多个角色,一个角色可以分配给许多用户。 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将创建链接users_rolesUser实体的Role表。

然后您将角色添加到用户:

$user = new User();

// $role1 and $role2 are instances of Role entity
$user->getRoles()->add($role1);
$user->getRoles()->add($role2);