与连接表的一个实体的适当实体关联映射(学说 2)

Posted

技术标签:

【中文标题】与连接表的一个实体的适当实体关联映射(学说 2)【英文标题】:Propper entity associations mapping with one entity for join table (Doctrine 2) 【发布时间】:2015-06-18 22:16:45 【问题描述】:

我的 mysql 数据库中有三个表,它们看起来像这些:

创建表`角色`( `id` 整数(10), `name` varchar(50), `order` tinyint(3) ); 创建表`用户`( `id` 整数(10), `用户名` varchar(50), `密码`字符(60) ); 创建表`user_role`( `id` 整数(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`), 约束 `user_role_ibfk_2` 外键 (`user_id`) 参考 `user` (`id`) );

注意:我从这些表中删除了一些定义部分,例如 AUTO_INCREMENT,因此只是为了使架构更简单。

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

我的第一个猜测是:

文件User.php

使用 Doctrine\ORM\Mapping 作为 ORM; 使用 Doctrine\Common\Collections\ArrayCollection; /** * 用户实体。 * * @ORM\实体 * @ORM\Table(name="用户") */ 类用户 /** * @ORM\ID * @ORM\Column(type="整数") * @ORM\GeneratedValue * * @var 整数 */ 受保护的$id; /** * @ORM\ManyToMany(targetEntity="Role", inversedBy="users") * @ORM\JoinTable(name="user_role") * * @var 角色[] */ 受保护的$角色; /** * @ORM\Column(type="string") * * @var 字符串 */ 受保护的$用户名; /** * @ORM\Column(type="string") * * @var 字符串 */ 受保护的$密码; 公共函数 __construct() $this->roles = new ArrayCollection;

文件Role.php

使用 Doctrine\ORM\Mapping 作为 ORM; 使用 Doctrine\Common\Collections\ArrayCollection; /** * 角色实体。 * * @ORM\实体 * @ORM\Table(name="角色") */ 类角色 /** * @ORM\ID * @ORM\Column(type="整数") * @ORM\GeneratedValue * * @var 整数 */ 受保护的$id; /** * @ORM\ManyToMany(targetEntity="User", mappedBy="roles") * * @var 用户[] */ 受保护的 $users; /** * @ORM\Column(type="string") * * @var 字符串 */ 受保护的$名称; 公共函数 __construct() $this->users = new ArrayCollection;

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

有什么帮助吗?

【问题讨论】:

订单栏目的是什么?如果您在 user_role 表中需要它,您可能在类中需要它,并且应该创建 UserRole 类。 user_role 表中order 列的目的是存储用户在给定角色中的位置信息。可能该表应该重命名为 user_in_role_order 之类的东西,这在语义上似乎更正确,但第三个 UserInRoleOrder 实体类仍然存在问题。映射信息应该是什么样的? Role->users 是否有可能让这个属性直接引用User 并且仍然在Role->users 中拥有按UserInRoleOrder->order 排序的结果集合?我怎样才能做到这一点?我还是教义 2 的新手。 【参考方案1】:

您已在此处应用 ma​​nyTomany 关系,因此 user_role 是关系表。因此它将仅生成关系列。您可以在表中手动添加新列,但在创建角色时不会填充对于用户,它不会填写订单列。

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

【讨论】:

【参考方案2】:

在 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

【讨论】:

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

Symfony学说OneToAll关系

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

学说 Symfony2 坚持与现有的关联实体

学说选择innerJoined实体或没有关联的实体

如何让 Symfony 2 与学说 ORM 只保留一次相关实体

学说 oneToOne 单向:获取映射对象