在Propel中命名生成的函数

时间:2011-08-17 10:46:50

标签: symfony1 many-to-many symfony-1.4 yaml propel

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()可以更好地工作时。编写执行此操作的自定义函数是可能的,但能够在模式中定义它会更有意义。

2 个答案:

答案 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)。

威廉