Propper实体关联与一个实体映射为连接表(Doctrine 2)

时间:2015-04-13 14:39:40

标签: php entity-framework orm doctrine-orm

我的MySQL数据库中有三个表,看起来像是theese:


CREATE TABLE `role` (
  `id`    int(10),
  `name`  varchar(50),
  `order` tinyint(3)
);


CREATE TABLE `user` (
  `id`       int(10),
  `username` varchar(50),
  `password` char(60)
);


CREATE TABLE `user_role` (
  `id`      int(10),
  `user_id` int(10),
  `role_id` int(10),
  `order`   int(10),
  KEY `user_id` (`user_id`),
  KEY `role_id` (`role_id`),
  CONSTRAINT `user_role_ibfk_1` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`),
  CONSTRAINT `user_role_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
);

注意:我从那些表中删除了一些定义部分,比如AUTO_INCREMENT,这样只是为了保持模式更简单。

我的问题是,我需要将这些表映射到实体类,例如UserRole,但我不知道如何管理{{1}中的order列表以及如何在实体中管理这些关系。

我的第一个猜测是:

档案user_role


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

/**
 * User entity.
 *
 * @ORM\Entity
 * @ORM\Table(name="user")
 */
class User
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     *
     * @var integer
     */
    protected $id;

    /**
     * @ORM\ManyToMany(targetEntity="Role", inversedBy="users")
     * @ORM\JoinTable(name="user_role")
     *
     * @var Role[]
     */
    protected $roles;

    /**
     * @ORM\Column(type="string")
     *
     * @var string
     */
    protected $username;

    /**
     * @ORM\Column(type="string")
     *
     * @var string
     */
    protected $password;


    public function __construct()
    {
        $this->roles = new ArrayCollection;
    }

}

档案User.php


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

/**
 * Role entity.
 *
 * @ORM\Entity
 * @ORM\Table(name="role")
 */
class Role
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     *
     * @var integer
     */
    protected $id;

    /**
     * @ORM\ManyToMany(targetEntity="User", mappedBy="roles")
     *
     * @var User[]
     */
    protected $users;

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


    public function __construct()
    {
        $this->users = new ArrayCollection;
    }

}

这些实体将生成我需要的三个表,但Role.php表中没有我真正需要的order列。把它放在那里很重要。我也可以创建第三个实例,例如user_role,但我不知道那时的映射信息是什么。

请帮忙吗?

2 个答案:

答案 0 :(得分:0)

你已经在这里应用了 manyTomany 关系,所以user_role是关系表。所以它只生成关系列。你可以在你的表中手动添加新列,但是当你创建一个角色时它不会被填充对于用户,它不会填写订单栏。

您应该创建具有以下属性userid,roleid和order的新实体userRoleOrder 在用户实体和userRoleOrder实体之间使用 oneToOne 关系

答案 1 :(得分:0)

在ManyToMany关系中对参数进行归档的最简单方法是在您的案例UserAndRole中创建SomethingAndSomething实体类,这是一个简单的示例,应该为您提供一个如何对想要的内容进行归档的

/** @Table(name="user_role") */
class UserAndRole
{
    /** @Column */
    private $id;

    // get

    /** @ManyToOne(targetEntity="Acme\Entity\User", inversedBy="userAndRoles") */ 
    private $user;

    // get / set

    /** @ManyToOne(targetEntity="Acme\Entity\Role") */ 
    private $role;

    // get / set

    /** @Column */
    private $order;

    // get / set
}

这是您的用户类别

/** @Table(name="user") */
class User
{

    /** @OneToMany(targetEntity="Acme\Entity\UserAndRole", mappedBy="user") */
    private $userAndRoles;

    // add / remove / get / set
}

在您的控制器/事件等中,您只需

$userAndRole = new UserAndRole();
$userAndRole->setUser($user);
$userAndRole->setRole($role);
$userAndRole->setOrder($order);
// PERSIST