在最近的会议上,我得到一个要求,对于所有的多对多关系,我们应该创建中间实体,并且有多对一和一对多关系。 例如,我们有实体“用户”和“角色”。我需要创建一个中间实体“UserRole”。
class User implements UserInterface, PasswordAuthenticatedUserInterface
{
/**
* @ORM\OneToMany(targetEntity=UserRole::class, mappedBy="user")
*/
private $userRole;
}
class UserRole
{
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="userRole")
* @ORM\JoinColumn(nullable=false)
*/
private $user;
/**
* @ORM\ManyToOne(targetEntity="Role", inversedBy="userRole")
* @ORM\JoinColumn(nullable=false)
*/
private $role;
}
class Role
{
/**
* @ORM\OneToMany(targetEntity=UserRole::class, mappedBy="role")
*/
private $userRole;
}
我知道一些开发人员使用这种方法以防 UserRole 实体中有一些额外的参数,但在上面的示例中 - 没有。是否有一些学说官方建议或最佳实践?什么是优点和缺点?
除了你说的最大的pro,所以有可能加强与其他领域的联系,我想不出任何相关的pro。
一个缺点是 Doctine/Symfony + DoctrineBundle 执行更多的代码来注册额外的实体,为其存储库等。它使应用程序稍微不太优化。另一个是如果你有很多多对多的中间实体,你的文件列表可能会变大,每个文件一个。
我会说你应该使用常规的多对多映射,除非你想在未来节省重构时间,因为你确定或几乎确定关系将被扩展。