Как работают отношения
Отношения связывают два объекта между собой. В Twenty отношения всегда двунаправленные — у каждого отношения есть две стороны, и каждая сторона объявляется как поле, ссылающееся на другую.
Каждое отношение требует двух полей, которые ссылаются друг на друга:
- Сторона MANY_TO_ONE — находится в объекте, который содержит внешний ключ.
- Сторона ONE_TO_MANY — находится в объекте, которому принадлежит коллекция.
FieldType.RELATION и ссылаются друг на друга через relationTargetFieldMetadataUniversalIdentifier.
Пример: Почтовая открытка имеет много получателей
PostCard может быть отправлен множеству записей PostCardRecipient. Каждый получатель относится ровно к одной открытке.
Шаг 1: Определите сторону ONE_TO_MANY на PostCard (сторона “one”):
src/fields/post-card-recipients-on-post-card.field.ts
src/fields/post-card-on-post-card-recipient.field.ts
Циклические импорты: оба поля отношений ссылаются на
universalIdentifier друг друга. Чтобы избежать проблем с циклическими импортами, экспортируйте идентификаторы полей как именованные константы из каждого файла и импортируйте их в другом. Система сборки разрешает это на этапе компиляции.Связи через промежуточный объект
Промежуточный объект связывает одну исходную запись с одной или несколькими целевыми записями. Например,PostCardRecipient может содержать связь postCard и связь recipient. В поле ONE_TO_MANY исходного объекта задайте для junctionTargetFieldUniversalIdentifier поле связи в промежуточном объекте, указывающее на цель:
RECIPIENT_FIELD_ID должен идентифицировать связь MANY_TO_ONE или морфную связь в промежуточном объекте. Это сообщает Twenty, какая связанная запись является целевой, когда функция, например распределение действий временной шкалы, проходит через промежуточный объект.
Связывание со стандартными объектами
Чтобы создать отношение со встроенным объектом Twenty (Person, Company и т. д.), используйтеSTANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.
Связь всегда объявляется для обоих объектов, и это не меняется, когда одна из сторон является стандартным объектом: манифест также должен определять обратное поле в стандартном объекте, используя universalIdentifier стандартного объекта в качестве objectUniversalIdentifier. Если обратное поле отсутствует, приложению не удается синхронизироваться с ошибкой Relation field target metadata not found.
src/fields/person-on-self-hosting-user.field.ts
src/fields/self-hosting-users-on-person.field.ts
Свойства поля отношения
Встроенные поля связей
Вы также можете объявить связь напрямую внутриdefineObject. При встроенном объявлении опустите objectUniversalIdentifier — он наследуется от родительского объекта: