【发布时间】:2012-08-21 23:20:47
【问题描述】:
我正在使用带有 PropelBundle 的 Symfony2,假设我有以下架构:
<table name="person">
<column name="id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
<column name="name" type="VARCHAR" size="100" required="true"/>
</table>
<table name="person_parent">
<column name="person_id" type="INTEGER" primaryKey="true" required="true"/>
<column name="parent_id" type="INTEGER" primaryKey="true" required="true"/>
</table>
考虑一个人可以有很多“父母”,就像父母可以有很多孩子“人”一样。 “person_parent”表中的两列都是“person”表的外键。不像 Book/Author 这样的关系,可以在表“book_author”的模式中设置 isCrossRef="true" 以让 Propel 生成用于直接从作者类获取/设置/添加书籍对象的方法,反之亦然,用于父/子关系无法设置 isCrossRef="true",因此无法直接从“Person”对象获取/设置/添加父 Person 对象。换句话说,这是不可能的:
$person = new Person();
$person->setPersonParents($personCollection);
设置任何给定人员的所有父“Person”对象的方法“setPersonParents()”不可用。但是,对于不引用同一个表(如 author_book)的交叉表,设置 isCrossRef="true" 允许以下操作:
$author = new Author();
$author->setBooks($bookCollection);
考虑到这一点,也不可能在“新人”表单中直接选择人的“父母”...
对于类似朋友的关系,有EqualNestBehavior,它允许:
$person = new Person();
$person->setFriends($personCollection);
但是,这种行为似乎不适用于父/子关系,因为它不关心层次结构(如果尝试获取任何给定“人”的“父”,则可以获取该“人”的所有“子”人”除了它的“父母”......)。这是人们对“朋友喜欢”的关系所期望的行为,其中一个人的朋友也是那个人的朋友。
有没有办法将EqualNestBehavior 用于父/子案例?还是有任何其他 Propel 行为或方法来处理这种关系?
【问题讨论】:
-
请附上代码和架构示例
-
用inheritance怎么样?
-
@thecatontheflat :我修改了问题陈述以使其清楚......
-
@WilliamDURAND :继承似乎不适用,因为作为“父母”的人也可以是另一个人的孩子,因此我无法创建“孩子”类和“父母”类,因为它们两者都可以引用同一行...
-
你说得对,我现在看到了你的用例。