Doctrine2:将具有子实体的对象映射到实体而不需要附加表

时间:2016-06-06 19:14:47

标签: php entity-framework orm doctrine-orm zend-framework2

我在这个问题上挣扎了好几个小时......

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

目前,BuddyPreferenceBuddy的一对一关联,其数据库列preference_idPreference只有{{1}没有别的。 idPreference具有多对多关联,由Doctrine映射为University表,其中包含buddy_preferences_universitiespreference_id列。

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

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

这是由Doctrine buddy_id创建的表格的图像:

DB Tables

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

谢谢!

2 个答案:

答案 0 :(得分:0)

你能不能像这样制作buddy_preferences表:

id: char(36)
university_id: char(36)
country_id: char(36)
interest_id: char(36)

就像那样,你可以放弃3个连接表。

现在你可以$buddy->getPreference()->getUniversity();

答案 1 :(得分:0)

如何删除模型的Preference实体,然后与Many2ManyBuddy实体的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;
}

虽然它是满足您需求的解决方案,但我并不认为它是一个良好解决方案。

如果您不需要$buddy->getPreference()对象,为什么Preference如此重要?