与连接表的一个实体的适当实体关联映射(学说 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,因此只是为了使架构更简单。
我的问题是,我需要将这些表映射到实体类,例如 User
和 Role
但我不知道如何管理 user_role
表中的 order
列以及如何管理这些实体中的关系。
我的第一个猜测是:
文件User.php
文件Role.php
这些实体将生成三个我需要的表,但user_role
表中没有我真正需要的order
列。把它放在那里很重要。我也可以创建第三个实体,例如 UserRole
,但我不知道映射信息会是什么样的。
有什么帮助吗?
【问题讨论】:
订单栏目的是什么?如果您在 user_role 表中需要它,您可能在类中需要它,并且应该创建 UserRole 类。user_role
表中order
列的目的是存储用户在给定角色中的位置信息。可能该表应该重命名为 user_in_role_order
之类的东西,这在语义上似乎更正确,但第三个 UserInRoleOrder
实体类仍然存在问题。映射信息应该是什么样的? Role->users
是否有可能让这个属性直接引用User
并且仍然在Role->users
中拥有按UserInRoleOrder->order
排序的结果集合?我怎样才能做到这一点?我还是教义 2 的新手。
【参考方案1】:
您已在此处应用 manyTomany 关系,因此 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)的主要内容,如果未能解决你的问题,请参考以下文章
Propper实体关联与一个实体映射为连接表(Doctrine 2)