Come funzionano le relazioni
Le relazioni collegano due oggetti tra loro. In Twenty, le relazioni sono sempre bidirezionali — ogni relazione ha due lati e ciascun lato è dichiarato come un campo che fa riferimento all’altro.
Ogni relazione richiede due campi che fanno riferimento l’uno all’altro:
- Il lato MANY_TO_ONE — risiede sull’oggetto che detiene la chiave esterna.
- Il lato ONE_TO_MANY — risiede sull’oggetto che possiede la collezione.
FieldType.RELATION e si riferiscono reciprocamente tramite relationTargetFieldMetadataUniversalIdentifier.
Esempio: Post Card ha molti destinatari
UnPostCard può essere inviato a molti record PostCardRecipient. Ogni destinatario appartiene esattamente a una sola cartolina.
Passaggio 1: definisci il lato ONE_TO_MANY su PostCard (il lato “uno”):
src/fields/post-card-recipients-on-post-card.field.ts
src/fields/post-card-on-post-card-recipient.field.ts
Importazioni circolari: entrambi i campi di relazione fanno riferimento all’
universalIdentifier dell’altro. Per evitare problemi di importazioni circolari, esporta gli ID dei campi come costanti denominate da ciascun file e importale nell’altro. Il sistema di build le risolve in fase di compilazione.Relazioni di giunzione
Un oggetto di giunzione collega un record di origine a uno o più record di destinazione. Ad esempio,PostCardRecipient può contenere sia una relazione postCard sia una relazione recipient. Nel campo ONE_TO_MANY dell’oggetto di origine, imposta junctionTargetFieldUniversalIdentifier sul campo di relazione dell’oggetto di giunzione che punta alla destinazione:
RECIPIENT_FIELD_ID deve identificare una relazione MANY_TO_ONE o morph nell’oggetto di giunzione. Indica a Twenty quale record correlato è la destinazione quando una funzionalità come la distribuzione delle attività della timeline attraversa la giunzione.
Relazioni con gli oggetti standard
Per creare una relazione con un oggetto Twenty integrato (Person, Company, ecc.), usaSTANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.
Una relazione viene sempre dichiarata su entrambi gli oggetti e questo non cambia quando un lato è un oggetto standard: il manifest deve anche definire il campo inverso sull’oggetto standard, con universalIdentifier dell’oggetto standard come objectUniversalIdentifier. Se il campo inverso è assente, l’app non riesce a sincronizzarsi 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
Proprietà dei campi di relazione
Campi di relazione inline
Puoi anche dichiarare una relazione direttamente all’interno didefineObject. Quando è inline, ometti objectUniversalIdentifier — viene ereditato dall’oggetto padre: