Ana içeriğe atla

Documentation Index

Fetch the complete documentation index at: https://docs.twenty.com/llms.txt

Use this file to discover all available pages before exploring further.

İlişkiler iki nesneyi birbirine bağlar. Twenty’de ilişkiler her zaman çift yönlüdür — her ilişkinin iki tarafı vardır ve her taraf diğeriyle ilişkili alan olarak tanımlanır.
İlişki türüAçıklamaYabancı anahtar var mı?
MANY_TO_ONEBu nesnenin birçok kaydı, hedefin bir kaydını işaret ederEvet (joinColumnName)
ONE_TO_MANYBu nesnenin bir kaydı, hedefin birçok kaydına sahiptirHayır (ters taraf)

İlişkiler nasıl çalışır

Her ilişki, birbirine referans veren iki alan gerektirir:
  1. MANY_TO_ONE tarafı — yabancı anahtarı tutan nesne üzerinde bulunur.
  2. ONE_TO_MANY tarafı — koleksiyona sahip olan nesne üzerinde bulunur.
Her iki alan da FieldType.RELATION kullanır ve relationTargetFieldMetadataUniversalIdentifier aracılığıyla birbirine karşılıklı referans verir.

Örnek: Posta Kartı’nın birçok Alıcısı vardır

Bir PostCard birçok PostCardRecipient kaydına gönderilebilir. Her alıcı tam olarak bir posta kartına aittir. Adım 1: PostCard üzerinde ONE_TO_MANY tarafını tanımlayın (“bir” taraf):
src/fields/post-card-recipients-on-post-card.field.ts
import { defineField, FieldType, RelationType } from 'twenty-sdk/define';
import { POST_CARD_UNIVERSAL_IDENTIFIER } from '../objects/post-card.object';
import { POST_CARD_RECIPIENT_UNIVERSAL_IDENTIFIER } from '../objects/post-card-recipient.object';

// Export so the other side can reference it
export const POST_CARD_RECIPIENTS_FIELD_ID = 'a1111111-1111-1111-1111-111111111111';
// Import from the other side
import { POST_CARD_FIELD_ID } from './post-card-on-post-card-recipient.field';

export default defineField({
  universalIdentifier: POST_CARD_RECIPIENTS_FIELD_ID,
  objectUniversalIdentifier: POST_CARD_UNIVERSAL_IDENTIFIER,
  type: FieldType.RELATION,
  name: 'postCardRecipients',
  label: 'Post Card Recipients',
  icon: 'IconUsers',
  relationTargetObjectMetadataUniversalIdentifier: POST_CARD_RECIPIENT_UNIVERSAL_IDENTIFIER,
  relationTargetFieldMetadataUniversalIdentifier: POST_CARD_FIELD_ID,
  universalSettings: {
    relationType: RelationType.ONE_TO_MANY,
  },
});
Adım 2: PostCardRecipient üzerinde MANY_TO_ONE tarafını tanımlayın (“çok” taraf — yabancı anahtarı tutar):
src/fields/post-card-on-post-card-recipient.field.ts
import { defineField, FieldType, RelationType, OnDeleteAction } from 'twenty-sdk/define';
import { POST_CARD_UNIVERSAL_IDENTIFIER } from '../objects/post-card.object';
import { POST_CARD_RECIPIENT_UNIVERSAL_IDENTIFIER } from '../objects/post-card-recipient.object';

// Export so the other side can reference it
export const POST_CARD_FIELD_ID = 'b2222222-2222-2222-2222-222222222222';
// Import from the other side
import { POST_CARD_RECIPIENTS_FIELD_ID } from './post-card-recipients-on-post-card.field';

export default defineField({
  universalIdentifier: POST_CARD_FIELD_ID,
  objectUniversalIdentifier: POST_CARD_RECIPIENT_UNIVERSAL_IDENTIFIER,
  type: FieldType.RELATION,
  name: 'postCard',
  label: 'Post Card',
  icon: 'IconMail',
  relationTargetObjectMetadataUniversalIdentifier: POST_CARD_UNIVERSAL_IDENTIFIER,
  relationTargetFieldMetadataUniversalIdentifier: POST_CARD_RECIPIENTS_FIELD_ID,
  universalSettings: {
    relationType: RelationType.MANY_TO_ONE,
    onDelete: OnDeleteAction.CASCADE,
    joinColumnName: 'postCardId',
  },
});
Döngüsel içe aktarmalar: Her iki ilişki alanı da birbirlerinin universalIdentifier değerine referans verir. Döngüsel içe aktarma sorunlarından kaçınmak için, alan kimliklerinizi her dosyadan adlandırılmış sabitler olarak dışa aktarın ve diğerinde içe aktarın. Derleme sistemi bunları derleme zamanında çözer.

Standart nesnelerle ilişkilendirme

Yerleşik bir Twenty nesnesiyle (Person, Company, vb.) ilişki oluşturmak için STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS kullanın:
src/fields/person-on-self-hosting-user.field.ts
import {
  defineField,
  FieldType,
  RelationType,
  OnDeleteAction,
  STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS,
} from 'twenty-sdk/define';
import { SELF_HOSTING_USER_UNIVERSAL_IDENTIFIER } from '../objects/self-hosting-user.object';

export const PERSON_FIELD_ID = 'c3333333-3333-3333-3333-333333333333';
export const SELF_HOSTING_USER_REVERSE_FIELD_ID = 'd4444444-4444-4444-4444-444444444444';

export default defineField({
  universalIdentifier: PERSON_FIELD_ID,
  objectUniversalIdentifier: SELF_HOSTING_USER_UNIVERSAL_IDENTIFIER,
  type: FieldType.RELATION,
  name: 'person',
  label: 'Person',
  description: 'Person matching with the self hosting user',
  isNullable: true,
  relationTargetObjectMetadataUniversalIdentifier:
    STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.person.universalIdentifier,
  relationTargetFieldMetadataUniversalIdentifier: SELF_HOSTING_USER_REVERSE_FIELD_ID,
  universalSettings: {
    relationType: RelationType.MANY_TO_ONE,
    onDelete: OnDeleteAction.SET_NULL,
    joinColumnName: 'personId',
  },
});

İlişki alanı özellikleri

ÖzellikZorunluAçıklama
typeEvetFieldType.RELATION olmalıdır
relationTargetObjectMetadataUniversalIdentifierEvetHedef nesnenin universalIdentifier değeri
relationTargetFieldMetadataUniversalIdentifierEvetHedef nesnedeki eşleşen alanın universalIdentifier değeri
universalSettings.relationTypeEvetRelationType.MANY_TO_ONE veya RelationType.ONE_TO_MANY
universalSettings.onDeleteYalnızca MANY_TO_ONEBaşvurulan kayıt silindiğinde ne olacağı: CASCADE, SET_NULL, RESTRICT veya NO_ACTION
universalSettings.joinColumnNameYalnızca MANY_TO_ONEYabancı anahtar için veritabanı sütun adı (örn. postCardId)

Satır içi ilişki alanları

Bir ilişkiyi doğrudan defineObject içinde de tanımlayabilirsiniz. Satır içi olduğunda, objectUniversalIdentifier’ı atlayın — üst nesneden devralınır:
export default defineObject({
  universalIdentifier: '...',
  nameSingular: 'postCardRecipient',
  // ...
  fields: [
    {
      universalIdentifier: POST_CARD_FIELD_ID,
      type: FieldType.RELATION,
      name: 'postCard',
      label: 'Post Card',
      relationTargetObjectMetadataUniversalIdentifier: POST_CARD_UNIVERSAL_IDENTIFIER,
      relationTargetFieldMetadataUniversalIdentifier: POST_CARD_RECIPIENTS_FIELD_ID,
      universalSettings: {
        relationType: RelationType.MANY_TO_ONE,
        onDelete: OnDeleteAction.CASCADE,
        joinColumnName: 'postCardId',
      },
    },
    // … other fields
  ],
});