Skip to main content
Отношения связывают два объекта между собой. В Twenty отношения всегда двунаправленные — у каждого отношения есть две стороны, и каждая сторона объявляется как поле, ссылающееся на другую.

Как работают отношения

Каждое отношение требует двух полей, которые ссылаются друг на друга:
  1. Сторона MANY_TO_ONE — находится в объекте, который содержит внешний ключ.
  2. Сторона ONE_TO_MANY — находится в объекте, которому принадлежит коллекция.
Оба поля используют FieldType.RELATION и ссылаются друг на друга через relationTargetFieldMetadataUniversalIdentifier.

Пример: Почтовая открытка имеет много получателей

PostCard может быть отправлен множеству записей PostCardRecipient. Каждый получатель относится ровно к одной открытке. Шаг 1: Определите сторону ONE_TO_MANY на PostCard (сторона “one”):
src/fields/post-card-recipients-on-post-card.field.ts
Шаг 2: Определите сторону MANY_TO_ONE на PostCardRecipient (сторона “many” — содержит внешний ключ):
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:
src/fields/person-on-self-hosting-user.field.ts

Свойства поля отношения

Встроенные поля связей

Вы также можете объявить связь напрямую внутри defineObject. При встроенном объявлении опустите objectUniversalIdentifier — он наследуется от родительского объекта: