Именование сгенерированных функций в Propel - PullRequest
2 голосов
/ 17 августа 2011

Идея таблиц перекрестных ссылок введена в 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

Выше,Дочернему объекту будут даны функции getPersonRelatedByFatherId() и getPersonRelatedByMotherId(), когда сразу должно быть очевидно, что getMother() и getFather() будут работать лучше.Можно написать пользовательские функции, которые делают это, но было бы гораздо разумнее определить это в схеме.

Ответы [ 2 ]

3 голосов
/ 31 декабря 2011

Решение находится здесь, в документации Propel, но я никогда не замечал этого до сегодняшнего дня: http://www.propelorm.org/documentation/04-relationships.html

Propel генерирует метод setAuthor () на основе атрибута phpName элемента всхема.Если атрибут не установлен, 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>

Обратите внимание на атрибут «phpName» в элементе «external-key», в котором вы задаете имя своей пользовательской связи.Если вы оставите это поле пустым (как я всегда делал до сегодняшнего дня), он будет использовать «phpName» таблицы внешних связей или само имя таблицы, если phpName не задан в таблице.

0 голосов
/ 01 ноября 2011

AFAIK это невозможно, но Propel 1.6.3 генерирует лучшие методы и полностью интегрирует NN-отношения, и предоставляется свободный API (например, установщик / получатель для коллекций).

Уильям

...