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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Propper实体关联与一个实体映射为连接表(Doctrine 2)相关的知识,希望对你有一定的参考价值。

我的mysql数据库中有三个表,如下所示:


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,但我不知道如何管理order表中的user_role列以及如何在实体中管理这些关系。

我的第一个猜测是:

档案User.php


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;
    }

}

档案Role.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;
    }

}

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

有什么帮助吗?

答案

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

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

以上是关于Propper实体关联与一个实体映射为连接表(Doctrine 2)的主要内容,如果未能解决你的问题,请参考以下文章

在 Hibernate 中使用连接表初始化多对多关联

Java自定义注解注解实现实体类与数据库表字段的映射

Java自定义注解注解实现实体类与数据库表字段的映射

Symfony学说OneToAll关系

《企业应用架构模式》 三

如何使用 Spring Data JPA(Hibernate) 跨映射表过滤关联实体?