Doctrine 2 具有三个实体和一个连接表的多对多

标签 doctrine many-to-many doctrine-orm

我有3张 table

People
 - id -pk
 - name

Roles
 - id -pk
 - roleName

Events
 - id -pk
 - title

和一个连接表

event_performers
 - event_id -pk
 - role_id -pk
 - people_id -pk

一个事件有很多角色。 角色由人员执行。 一个角色与许多事件相关联。 一个人可以扮演多种角色。

所以我想要的是,当我收到一个事件时,我可以访问与该事件相关的角色集合,并且从角色中我可以获取执行该角色的人员。

我不确定如何将其映射到 Doctrine 2 中?

最佳答案

大约一周前我遇到了同样的问题。我向 Doctrine IRC channel 用户进行了民意调查,寻找最佳解决方案(或者至少是最常用的解决方案)。其实现方式如下:

创建一个名为 EventsPeopleRoles 之类的新实体,并使用 @ManyToOne、$event、$person 和 $role 映射三个属性。

每个关联的映射应与此类似:

/**
 * @ManyToOne(targetEntity="Events", inversedBy="eventsPeopleRoles")
 * @JoinColumn(name="event_id", referencedColumnName="id", nullable=false)
 */
private $event;

然后在三个相关实体中的每一个中,对关联的反面进行编码,如下所示:

/**
 * @OneToMany(targetEntity="EventsPeopleRoles", mappedBy="event")
 */
private $eventsPeopleRoles;

然后,您可以选择将 $id 属性添加到“连接实体”或使用复合主键,如here所述。并在实体类定义中添加唯一约束注释。请注意,仅从 Doctrine 2.1 开始才支持复合外键。

我对此解决方案持怀疑态度,因为我不喜欢仅出于连接目的而创建实体的想法。这看起来像是作弊,或者至少与 ORM 设计 Doctrine 相反。但我相信这是 Doctrine 专家们公认的解决方案(至少目前如此)。

关于 Doctrine 2 具有三个实体和一个连接表的多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7903773/

相关文章:

Symfony 查询生成器连接 ON 和 WITH 区别

php - 为 Admin Sonata 添加自己的字段

mysql - 使用查询生成器进行复杂的连接查询

doctrine - Doctrine 2.1 @Column 注释中 "options"的语法是什么?

php - 使用带有别名的 Doctrine/错误的子查询

Symfony2 : Error persisting ManyToMany/OneToMany Relationships

php - Symfony/查询生成器 : "myEntityAlias.myEntity.id" <- possible?

mysql - SQL inner join 多对多实例存在

sql - 如何在id上查询多对多表匹配/连接

java - Hibernate manyToMany 只返回一个元素