Skip to content

İlişkiler

Curvhex ORM, include seçeneğini kullanarak tek bir sorgu çağrısında ilgili hesapları yükleyebilir. Çekmeleri otomatik olarak tekilleştirir — 100 vault aynı sahibi paylaşıyorsa o sahip hesabı yalnızca bir kez çekilir.

Temel include

foreignKey ile ilgili modeli ve mevcut modeldeki diğer hesabın public key'ini tutan alanı belirterek bir ilişki tanımla.

typescript
const VaultAccount = defineModel({
  discriminator: anchor('VaultAccount'),
  fields: {
    ownerPubkey: { type: 'publicKey' },
    totalLocked: { type: 'u64' },
    isActive:    { type: 'bool' },
  },
})

const vaults = await orm.models.vaultAccount.findMany({
  where:   { totalLocked: { gt: 1000n } },
  include: {
    owner: {
      model:      UserAccount,
      foreignKey: 'ownerPubkey',
    },
  },
})

Sonuç şekli:

typescript
[
  {
    address:     'Vault1...',
    ownerPubkey: 'User1...',
    totalLocked: 5000n,
    isActive:    true,
    owner: {
      address:   'User1...',
      authority: 'Wallet1...',
      balance:   99500n,
      tier:      2,
    },
  },
]

Referans verilen hesap zincir üstünde mevcut değilse owner null olur.

Çoklu İlişkiler

Aynı sorguda birden fazla ilişki ekle:

typescript
const positions = await orm.models.position.findMany({
  where: { isOpen: true },
  include: {
    user:   { model: UserAccount,   foreignKey: 'userPubkey' },
    market: { model: MarketAccount, foreignKey: 'marketPubkey' },
  },
})

Tekilleştirme

Birden fazla hesap aynı ilgili hesabı paylaşıyorsa yalnızca bir kez çekilir:

typescript
// 500 vault, ama yalnızca 12 benzersiz sahip
// → 500 değil, 12 fetchAccount çağrısı
const vaults = await orm.models.vaultAccount.findMany({
  include: { owner: { model: UserAccount, foreignKey: 'ownerPubkey' } },
})

Performans

RpcAdapter ve HeliusAdapter ile ilişkiler, benzersiz adres başına tekil getAccountInfo çağrısıyla çözülür. PostgresAdapter (yakında) ile ilişkiler SQL JOIN olarak çalışır.

Released under the Apache 2.0 License.