Doctrine2:将具有子实体的对象映射到没有附加表的实体

Posted

技术标签:

【中文标题】Doctrine2:将具有子实体的对象映射到没有附加表的实体【英文标题】:Doctrine2: Map Object with Sub-Entities to Entity without additional table 【发布时间】:2016-06-06 19:14:47 【问题描述】:

我为此苦苦挣扎了好几个小时......

我有一个Buddy 对象(实体),它持有(应该持有)一个Preference 对象。在这个对象中,我有几个子对象的集合。为简单起见,我将只用一个子对象来解释它。我们称之为University。它也是一个独立的实体。

目前,BuddyPreferenceBuddy 具有一对一关联,具有数据库列 preference_idPreference 只是一个 id,没有别的。 PreferenceUniversity 具有多对多关联,由 Doctrine 与 buddy_preferences_universities 表与 preference_iduniveristy_id 列映射。

我的目标是在BuddyUniversity 之间建立关联,保持描述的类层次结构,但不需要无用的preferences 表,即我仍然希望能够发出$unis = $buddy->getPreference()->getUniversities 和@987654341 @ 成为University[] 集合。

那么,是否可以“跳过”Preference 实体并直接将关联映射到 buddy_id

这是由 Doctrine 的 schema-tool 创建的表格的图像:

如有必要,我还可以发布类和/或 XML 映射文件。

谢谢!

【问题讨论】:

感谢您嵌入图片!只有 9 声望,我不允许这样做 ;-) Preference 对象的目标是什么?这是一个带有 Buddy 对象的 OneToMany 关系字段? Preference 可以分享给多个好友吗?如果没有,您应该使用与 BuddyUniversityCountryInterests 的多对多关系。 PreferenceBuddy 是一对一的关系。正如我所说,我希望能够使用$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 可以有多个Universitys (1:n)。因此我得到了buddy_preferences_universities 表。【参考方案2】:

如何删除模型的Preference 实体,然后用Many2Many 关系链接BuddyUniversity 实体。

如果您确实需要保留 $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)

从父实体映射中将可嵌入字段设置为主键 - Doctrine2

Doctrine2 中的条件关联

将具有子数组的对象数组映射和减少到具有父 ID 的子数组

使用 Doctrine2 从数组水合到对象

doctrine2 映射覆盖从 MappedSuperclass 继承的 inversedBy 字段。