Saltar al contenido principal

Cómo funcionan las relaciones

Las relaciones conectan dos objetos entre sí. En Twenty, las relaciones siempre son bidireccionales: cada relación tiene dos lados, y cada lado se declara como un campo que hace referencia al otro. Cada relación requiere dos campos que se referencian entre sí:
  1. El lado MANY_TO_ONE — vive en el objeto que contiene la clave foránea.
  2. El lado ONE_TO_MANY — vive en el objeto que es propietario de la colección.
Ambos campos usan FieldType.RELATION y se hacen referencia cruzada mediante relationTargetFieldMetadataUniversalIdentifier.

Ejemplo: la tarjeta postal tiene muchos destinatarios

Un PostCard puede enviarse a muchos registros PostCardRecipient. Cada destinatario pertenece exactamente a una tarjeta postal. Paso 1: Define el lado ONE_TO_MANY en PostCard (el lado “uno”):
src/fields/post-card-recipients-on-post-card.field.ts
Paso 2: Define el lado MANY_TO_ONE en PostCardRecipient (el lado “muchos” — contiene la clave foránea):
src/fields/post-card-on-post-card-recipient.field.ts
Importaciones circulares: ambos campos de relación hacen referencia al universalIdentifier del otro. Para evitar problemas de importaciones circulares, exporta los ID de tus campos como constantes con nombre desde cada archivo e impórtalos en el otro. El sistema de compilación los resuelve en tiempo de compilación.

Relaciones de unión

Un objeto de unión conecta un registro de origen con uno o más registros de destino. Por ejemplo, PostCardRecipient puede contener tanto una relación postCard como una relación recipient. En el campo ONE_TO_MANY del objeto de origen, establece junctionTargetFieldUniversalIdentifier en el campo de relación del objeto de unión que apunta al destino:
RECIPIENT_FIELD_ID debe identificar una relación MANY_TO_ONE o morph en el objeto de unión. Indica a Twenty qué registro relacionado es el destino cuando una función como la distribución de actividad de la cronología atraviesa la unión.

Relacionar con objetos estándar

Para crear una relación con un objeto integrado de Twenty (Person, Company, etc.), usa STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS. Una relación siempre se declara en ambos objetos, y esto no cambia cuando uno de los lados es un objeto estándar: el manifiesto también debe definir el campo inverso en el objeto estándar, con el universalIdentifier del objeto estándar como objectUniversalIdentifier. Si falta el campo inverso, la aplicación no puede sincronizarse con Relation field target metadata not found.
src/fields/person-on-self-hosting-user.field.ts
src/fields/self-hosting-users-on-person.field.ts

Propiedades del campo de relación

Campos de relación en línea

También puedes declarar una relación directamente dentro de defineObject. Cuando es en línea, omite objectUniversalIdentifier — se hereda del objeto padre: