Doctrine2:将具有子实体的对象映射到没有附加表的实体
Posted
技术标签:
【中文标题】Doctrine2:将具有子实体的对象映射到没有附加表的实体【英文标题】:Doctrine2: Map Object with Sub-Entities to Entity without additional table 【发布时间】:2016-06-06 19:14:47 【问题描述】:我为此苦苦挣扎了好几个小时......
我有一个Buddy
对象(实体),它持有(应该持有)一个Preference
对象。在这个对象中,我有几个子对象的集合。为简单起见,我将只用一个子对象来解释它。我们称之为University
。它也是一个独立的实体。
目前,Buddy
和 Preference
与 Buddy
具有一对一关联,具有数据库列 preference_id
和 Preference
只是一个 id
,没有别的。
Preference
和 University
具有多对多关联,由 Doctrine 与 buddy_preferences_universities
表与 preference_id
和 univeristy_id
列映射。
我的目标是在Buddy
和University
之间建立关联,保持描述的类层次结构,但不需要无用的preferences
表,即我仍然希望能够发出$unis = $buddy->getPreference()->getUniversities
和@987654341 @ 成为University[]
集合。
那么,是否可以“跳过”Preference
实体并直接将关联映射到 buddy_id
?
这是由 Doctrine 的 schema-tool
创建的表格的图像:
如有必要,我还可以发布类和/或 XML 映射文件。
谢谢!
【问题讨论】:
感谢您嵌入图片!只有 9 声望,我不允许这样做 ;-)Preference
对象的目标是什么?这是一个带有 Buddy
对象的 OneToMany 关系字段? Preference
可以分享给多个好友吗?如果没有,您应该使用与 Buddy
和 University
、Country
和 Interests
的多对多关系。
Preference
与Buddy
是一对一的关系。正如我所说,我希望能够使用$buddy->getPreference()->getUniversities()
而不是$buddy->getUniversities()
访问首选项。我想要一个干净的Buddy
对象,它没有一堆偏好。
【参考方案1】:
你能不能把你的buddy_preferences
表变成这样:
id: char(36)
university_id: char(36)
country_id: char(36)
interest_id: char(36)
这样,您可以删除 3 个连接表。
现在你可以$buddy->getPreference()->getUniversity();
【讨论】:
这很容易,但是Buddy
可以有多个University
首选项,因此University[]
集合:-(
@Thomas 好吧,在您当前的数据库模型中,这也是不可能的。或者这就是您需要解决方案的原因?
当然可以。一个Buddy
有一个Preference
对象(一对一关系),一个Preference
可以有多个University
s (1:n)。因此我得到了buddy_preferences_universities
表。【参考方案2】:
如何删除模型的Preference
实体,然后用Many2Many
关系链接Buddy
和University
实体。
如果您确实需要保留 $buddy->getPreference()->getUniversities()
函数调用以获取与 Buddy 对象链接的所有大学,而不是 $buddy->getUniversities()
(在我看来这听起来更合乎逻辑,但是..),您可以添加一个Buddy
类中的函数如下:
public function getUniversities()
return $this->universities;
// Now you'll be able to call $buddy->getPreference()->getUniversities()
public function getPreference()
return $this;
虽然它是满足您需求的解决方案,但我并不认为这是一个好的解决方案。
如果您不需要 Preference
对象,为什么 $buddy->getPreference()
如此重要?
【讨论】:
以上是关于Doctrine2:将具有子实体的对象映射到没有附加表的实体的主要内容,如果未能解决你的问题,请参考以下文章
Doctrine2 Mapping:2 个字段映射到一个字段(ManyToOne)