设计实体模型来管理多个双向关系
Posted
技术标签:
【中文标题】设计实体模型来管理多个双向关系【英文标题】:Design entity model to manage multiple bidirectionnal relations 【发布时间】:2013-06-17 02:40:05 【问题描述】:我正在尝试从我的模型中找到设计实体之间关系的最佳方式。我会尽量解释清楚。
想象以下 Doctrine2 实体:
class ImageHistory
/**
* @var Image
*/
protected $current;
/**
* @var \Doctrine\Common\Collections\Collection
*/
protected $old;
class Dog
protected $name;
/**
* @var ImageHistory
*/
protected $imageHistory;
class Cat
protected $name;
/**
* @var ImageHistory
*/
protected $imageHistory;
我想建立两个一对多的双向学说关系,其中Cat
和Dog
是关系的拥有方。 Cat
和 Dog
类都有这个实体配置:
manyToOne:
imageHistory:
targetEntity: ImageHistory
joinColumn:
name: image_history_id
referencedColumnName: id
如何表示te关系的另一边?
oneToMany:
owner:
targetEntity: <What can I write here?>
mappedBy: imageHistory
我想象一个解决方案,其中Cat
和Dog
继承Animal
实体类,因此我可以将ManyToOne 关系移动到Animal
类并将Animal
作为OneToMany 关系的targetEntity。但是如果我有一个新的SoundHistory
实体并且:Cat
、Dog
和新的Car
和Boat
类必须与它有关系,问题就会再次出现。
A 不能只是将 SoundHistory
添加为与 Animal
类的 oneToMany 关系,因为 Car
和 Boat
不会从它继承。所以我仍然无法在ImageHistory
实体中填充我的OneToMany 关系的targetEntity
。
在这种情况下设计实体模型的最佳方法是什么?
【问题讨论】:
您能解释一下 SQL 中的关系吗? 使用界面? ***.com/questions/42649553/… 使用一些 AbstractEntity?有点 MotherOfAllObjects/Entities 你可以使用@OneToMany注解。见enter link description here 【参考方案1】:Many-To-One Relation 是单向的,所以不能代表对方。
另外,如果您真的想将 Dogs 和 Cats 存储在同一个表中,您应该考虑创建一个超级实体。
【讨论】:
其实Many-To-One可以是bidir(见doctrine-project.org/projects/doctrine-orm/en/2.6/reference/…)。【参考方案2】:最好的方法是使用单独的连接表来表示Cat
、Dog
和ImageHistory
、SoundHistory
之间的关系。为此,您可以使用连接表的一对多单向映射。在这里找到教义文档,感谢 NaeiKinDus:https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/association-mapping.html#one-to-many-unidirectional-with-join-table
重点是 - 图像和声音历史记录是独立存储的,连接表 cat_image_history
存储 Cat
拥有的 ImageHistory
。所以 Doctrine 会得到你的猫的id
,检查cat_image_history
并通过image_history_id
得到正确的ImageHistory
。同样的方式,您可以为狗添加SoundHistory
,或者同时为猫和狗添加。
映射可能如下所示:
Cat:
type: entity
manyToMany:
imageHistory:
targetEntity: ImageHistory
joinTable:
name: cat_image_history
joinColumns:
cat_id:
referencedColumnName: id
inverseJoinColumns:
image_history_id:
referencedColumnName: id
unique: true
【讨论】:
以上是关于设计实体模型来管理多个双向关系的主要内容,如果未能解决你的问题,请参考以下文章