cross-reference tables的ideo在Propel 1.5中引入。这意味着实体可以获得相关项的列表,就好像它是一对多关系一样。因此,在人与群体的关系中,一个人可以拨打getGroups()
,一个群组可以拨打getPersons()
。
这使事情变得更容易处理。但是,如果实体与其自身具有多对多关系,则函数调用的名称将变得更加复杂。例如,以下内容允许组内包含组:
group:
id: ~
name: { type: varchar(255) }
sub_group:
group_id:
type: integer
primaryKey: true
foreignTable: group
foreignReference: id
required: true
sub_group_id:
type: integer
primaryKey: true
foreignTable: group
foreignReference: id
required: true
对于这种关系,Propel会生成功能笨拙的函数getGroupsRelatedByGroupId()
和getGroupsRelatedBySubGroupId()
。这些很长,并不是很明显。作为此实体的用户,我更倾向于使用getParentGroups()
和getSubGroups()
这些函数,我可以更清楚地理解这些函数。是否有可能告诉Propel重命名这些功能? phpName
属性似乎没有这样做。
一对多关系也会出现问题,如下面的简化示例所示:
child:
id: ~
father_id:
type: integer
foreignTable: person
mother_id:
type: integer
foreignTable: person
在上面,一个Child对象将被赋予函数getPersonRelatedByFatherId()
和getPersonRelatedByMotherId()
,当明显getMother()
和getFather()
可以更好地工作时。编写执行此操作的自定义函数是可能的,但能够在模式中定义它会更有意义。
答案 0 :(得分:3)
解决方案就在Propel文档中,但我直到今天才注意到它:http://www.propelorm.org/documentation/04-relationships.html
Propel根据模式中元素的phpName属性生成setAuthor()方法。如果未设置该属性,Propel将使用相关表的phpName。
使用您的第二个示例(在XML中,但转换为YML应该很简单):
<table name="person">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" />
<column name="father_id" type="integer" />
<column name="mother_id" type="integer" />
<foreign-key foreigntable="person" onDelete="setnull" phpName="father">
<reference local="father_id" foreign="id" />
</foreign-key>
<foreign-key foreigntable="person" onDelete="setnull" phpName="mother">
<reference local="mother_id" foreign="id" />
</foreign-key>
</table>
注意“foreign-key”元素中的“phpName”属性,即您设置自定义关系名称的位置。如果你把它留空(就像我今天以前一样)它将使用外部关系表的“phpName”,或者如果没有在表上设置phpName则使用表名。
答案 1 :(得分:0)
AFAIK它不可能,但Propel 1.6.3生成更好的方法并完全集成N-N关系,并提供了流畅的API(例如,集合的setter / getter)。
威廉