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çıklama | Yabancı anahtar var mı? |
|---|
MANY_TO_ONE | Bu nesnenin birçok kaydı, hedefin bir kaydını işaret eder | Evet (joinColumnName) |
ONE_TO_MANY | Bu nesnenin bir kaydı, hedefin birçok kaydına sahiptir | Hayır (ters taraf) |
İlişkiler nasıl çalışır
Her ilişki, birbirine referans veren iki alan gerektirir:
- MANY_TO_ONE tarafı — yabancı anahtarı tutan nesne üzerinde bulunur.
- 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
| Özellik | Zorunlu | Açıklama |
|---|
type | Evet | FieldType.RELATION olmalıdır |
relationTargetObjectMetadataUniversalIdentifier | Evet | Hedef nesnenin universalIdentifier değeri |
relationTargetFieldMetadataUniversalIdentifier | Evet | Hedef nesnedeki eşleşen alanın universalIdentifier değeri |
universalSettings.relationType | Evet | RelationType.MANY_TO_ONE veya RelationType.ONE_TO_MANY |
universalSettings.onDelete | Yalnızca MANY_TO_ONE | Başvurulan kayıt silindiğinde ne olacağı: CASCADE, SET_NULL, RESTRICT veya NO_ACTION |
universalSettings.joinColumnName | Yalnızca MANY_TO_ONE | Yabancı 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
],
});