Salt la conținutul principal

Cum funcționează relațiile

Relațiile conectează două obiecte între ele. În Twenty, relațiile sunt întotdeauna bidirecționale — fiecare relație are două părți, iar fiecare parte este declarată ca un câmp ce o referențiază pe cealaltă. Fiecare relație necesită două câmpuri care se referențiază reciproc:
  1. Partea MANY_TO_ONE — se află pe obiectul care deține cheia străină.
  2. Partea ONE_TO_MANY — se află pe obiectul care deține colecția.
Ambele câmpuri folosesc FieldType.RELATION și se referențiază încrucișat prin relationTargetFieldMetadataUniversalIdentifier.

Exemplu: Post Card are mulți destinatari

Un PostCard poate fi trimis către multe înregistrări PostCardRecipient. Fiecare destinatar aparține exact unui Post Card. Pasul 1: Definiți partea ONE_TO_MANY pe PostCard (partea “one”):
src/fields/post-card-recipients-on-post-card.field.ts
Pasul 2: Definiți partea MANY_TO_ONE pe PostCardRecipient (partea “many” — deține cheia străină):
src/fields/post-card-on-post-card-recipient.field.ts
Importuri circulare: ambele câmpuri de relație se referă unul la celălalt prin universalIdentifier. Pentru a evita problemele de import circular, exportați ID-urile câmpurilor ca constante denumite din fiecare fișier și importați-le în celălalt. Sistemul de build le rezolvă în timpul compilării.

Relații de joncțiune

Un obiect de joncțiune conectează o înregistrare sursă la una sau mai multe înregistrări-țintă. De exemplu, PostCardRecipient poate conține atât o relație postCard, cât și o relație recipient. În câmpul ONE_TO_MANY al obiectului sursă, setează junctionTargetFieldUniversalIdentifier la câmpul de relație de pe obiectul de joncțiune care indică spre țintă:
RECIPIENT_FIELD_ID trebuie să identifice o relație MANY_TO_ONE sau morfă pe obiectul de joncțiune. Acesta indică lui Twenty care înregistrare asociată este ținta atunci când o funcționalitate precum distribuirea activității din cronologie parcurge joncțiunea.

Relaționarea cu obiectele standard

Pentru a crea o relație cu un obiect Twenty încorporat (Person, Company etc.), utilizați STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS. O relație este declarată întotdeauna pe ambele obiecte, iar acest lucru nu se schimbă atunci când una dintre părți este un obiect standard: manifestul trebuie să definească și câmpul invers pe obiectul standard, cu universalIdentifier al obiectului standard ca objectUniversalIdentifier. Dacă lipsește câmpul invers, aplicația nu reușește să se sincronizeze cu Relation field target metadata not found.
src/fields/person-on-self-hosting-user.field.ts
src/fields/self-hosting-users-on-person.field.ts

Proprietăți ale câmpului de relație

Câmpuri de relație inline

Puteți, de asemenea, să declarați o relație direct în defineObject. Când este inline, omiteți objectUniversalIdentifier — este moștenit de la obiectul părinte: