我正在将Symfony2与PropelBundle一起使用,并且假设我有以下架构:
<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”对象获取/设置/添加Parent 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行为或方法来处理这种关系?
答案 0 :(得分:1)
我不确定EqualNestBehavior
,但您可以将工作流设置如下。
在您的架构中,将FK定义为Person
table:
<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"/>
<foreign-key foreignTable="person" name="p1" onDelete="CASCADE" onUpdate="CASCADE">
<reference local="person_id" foreign="id"/>
</foreign-key>
<foreign-key foreignTable="person" name="p2" onDelete="CASCADE" onUpdate="CASCADE">
<reference local="parent_id" foreign="id"/>
</foreign-key>
</table>
之后,当您生成模型时 - 您将获得以下方法:
$person = new Person();
$person->getPersonParentsRelatedByParentId();
$person->setPersonParentsRelatedByParentId($personCollection);
$person->getPersonParentsRelatedByPersonId();
$person->setPersonParentsRelatedByPersonId($personCollection);
Setters接受PropelCollection
作为参数。
你只需要考虑这种情况,不要像“得到父母”或“生孩子”,而应该考虑相关因素。