Fabric Uygulamalarında GraphQL ile veri okuma ve yazma

Fabric Apps, ham sorgular yazmadan oluşturma, okuma, güncelleştirme ve silme işlemleri gerçekleştirmenize olanak tanıyan, tür açısından güvenli bir GraphQL istemcisi sağlar. İstemci, yöntem çağrılarınızdan otomatik olarak GraphQL oluşturur ve veri modeli tanımlarınıza göre yazılan varlıkları döndürür.

Prerequisites

  • Veri modellerinin tanımlandığı bir Fabric Apps projesi. Bkz. Veri modellerini tanımlama.
  • Yerel olarak çalışan veya Fabric’e dağıtılmış arka uç hizmetleri.

İstemciyi başlatma

RayfinClient öğesini arka uç URL’niz, yayınlanabilir anahtarınız ve şema türünüzle başlatın:

import { RayfinClient } from '@microsoft/rayfin-client';
import type { Note } from '../rayfin/data/Note';
import type { Notebook } from '../rayfin/data/Notebook';

type AppSchema = { 
  Note: Note;
  Notebook: Notebook;
};

const client = new RayfinClient<AppSchema>({
  baseUrl: import.meta.env.VITE_RAYFIN_API_URL ?? 'http://localhost:5168',
  publishableKey: 'pk-your-project-key',
});

Genel tür bağımsız değişkeni, TypeScript'in tüm veri işlemleri için otomatik tamamlama ve tür denetimi sağlamasını sağlar.

Veriyi oku

client.data.<EntityName> aracılığıyla varlık koleksiyonlarına erişin. Akıcı API sorgulama, filtreleme, sıralama ve sayfalandırma yöntemleri sağlar.

Tüm kayıtları getir

const notes = await client.data.Note.select([
  'id',
  'title',
  'content',
  'createdAt',
  'isPinned',
]).execute();

Birincil anahtara göre tek bir kayıt getir

const note = await client.data.Note.findByPk('00000000-0000-0000-0000-000000000000');

Bu, varlığın tamamını döndürür veya bu kimliğe sahip bir kayıt yoksa null döndürür.

Kayıtları filtreleme

Sonuçları filtrelemek where() için yöntemini kullanın:

const pinnedNotes = await client.data.Note.select([
  'id',
  'title',
  'isPinned',
])
  .where({ isPinned: { eq: true } })
  .execute();

Filtre işleçleri

Operator Açıklama Example
eq Eşittir { status: { eq: 'active' } }
ne Eşit değil { status: { ne: 'archived' } }
gt Daha büyük { age: { gt: 18 } }
gte Büyüktür veya eşittir { age: { gte: 21 } }
lt Daha az { price: { lt: 100 } }
lte Küçüktür veya eşittir { price: { lte: 50 } }
contains Alt dize içerir { title: { contains: 'draft' } }

Sonuçları sıralama

Sorgu sonuçlarını sıralamak için kullanın orderBy() :

const notes = await client.data.Note.select([
  'id',
  'title',
  'createdAt',
])
  .orderBy({ createdAt: 'desc' })
  .execute();

Birden çok sütuna göre sırala:

const notes = await client.data.Note.select([
  'id',
  'title',
  'isPinned',
  'createdAt',
])
  .orderBy({ isPinned: 'desc' })
  .orderBy({ createdAt: 'desc' })
  .execute();

ve @one() dekoratörleriyle @many() ilişkileri tanımlarken, aynı sorguya ilgili varlık alanlarını ekleyebilirsiniz:

const notes = await client.data.Note.select([
  'id',
  'title',
  'content',
  'notebook.id',
  'notebook.name',
  'notebook.color',
])
  .execute();

Her not, ayrı bir sorgu gerektirmeden ilişkili not defteri verilerini içerir.

Büyük sonuç kümelerini sayfalandır

Büyük listeler için imleç tabanlı sayfalandırma kullanın:

const page = await client.data.Note.select([
  'id',
  'title',
  'createdAt',
])
  .orderBy({ createdAt: 'desc' })
  .first(25)
  .executePaginated();

console.log('Items:', page.items);
console.log('Has next page:', page.hasNextPage);
console.log('End cursor:', page.endCursor);

İmleci kullanarak sonraki sayfayı getirin:

if (page.hasNextPage) {
  const nextPage = await client.data.Note.select([
    'id',
    'title',
    'createdAt',
  ])
    .orderBy({ createdAt: 'desc' })
    .first(25)
    .after(page.endCursor)
    .executePaginated();
}

Uyarı

totalCount özelliği PagedResult türünde görünür, ancak arka uç tarafından doldurulmaz. Geçerli sayfadaki sonuçları saymak için kullanın items.length .

Kayıt oluşturma

create() Yeni kayıtlar eklemek için yöntemini kullanın:

const newNote = await client.data.Note.create({
  title: 'Meeting notes',
  content: 'Discussion points from the team sync',
  isPinned: false,
  isArchived: false,
  createdAt: new Date(),
  updatedAt: new Date(),
  user_id: 'user-123',
});

yöntemi, otomatik oluşturulan idda dahil olmak üzere tüm alanları doldurulmuş olarak oluşturulan varlığı döndürür.

İlişkilerle kayıt oluşturma

İlişkileri olan varlıklar oluştururken, tam ilgili nesneyi veya yalnızca birincil anahtara sahip bir nesneyi geçirin:

// Option 1: Pass just the ID
const note = await client.data.Note.create({
  title: 'Weekly summary',
  content: 'Summary of this week',
  notebook: { id: 'notebook-456' },
  isPinned: false,
  isArchived: false,
  createdAt: new Date(),
  updatedAt: new Date(),
});

// Option 2: Pass the full object
const notebook = await client.data.Notebook.findByPk('notebook-456');
const note = await client.data.Note.create({
  title: 'Weekly summary',
  content: 'Summary of this week',
  notebook: notebook,
  isPinned: false,
  isArchived: false,
  createdAt: new Date(),
  updatedAt: new Date(),
});

Her iki form da aynı sonucu üretir. İlgili varlığın kimliğini (ID’sini) zaten biliyorsanız ve ek bir getirme işlemini önlemek istiyorsanız ilk formu kullanın.

Kayıtları güncelleştirme

update() Mevcut kayıtları değiştirmek için yöntemini kullanın. Bir filtre nesnesi ve güncellenecek alanları içeren bir nesne geçirin:

await client.data.Note.update(
  { id: 'note-123' },
  {
    title: 'Updated title',
    updatedAt: new Date(),
  }
);

İlişkileri güncelleştirme

Bir ilişkiyi değiştirmek için yeni ilgili varlığı veya yalnızca kimliğini iletin:

// Move a note to a different notebook
await client.data.Note.update(
  { id: 'note-123' },
  { notebook: { id: 'new-notebook-789' } }
);

Kayıtları silme

Filtreyle delete() eşleşen kayıtları kaldırmak için yöntemini kullanın:

await client.data.Note.delete({ id: 'note-123' });

Yöntem, arka uç silme işlemini onayladığında tamamlanır. Filtreyle eşleşen kayıt yoksa yöntem yine başarılı olur.

Kimlik doğrulamayı yönetme

Kimlik doğrulaması etkinleştirildiğinde, veri işlemlerini gerçekleştirmeden önce oturum açın:

await client.auth.signIn({ email, password });

// All subsequent data calls include authentication context
const notes = await client.data.Note.select(['id', 'title']).execute();

İstemci, kimlik doğrulama oturumunu tüm veri API'leri çağrılarına otomatik olarak ekler. Belirteçleri el ile geçirmeniz gerekmez.

En iyi uygulamalar

  • Yalnızca gerekli alanları seçin : Yalnızca yük boyutunu küçültmek ve performansı geliştirmek için kullandığınız alanları getirin.
  • Büyük listeler için sayfalandırma kullanma – ve first()kullanarak executePaginated() aynı anda binlerce kayıt getirmekten kaçının.
  • Toplu ilişki sorguları – Ayrı istekler yapmak yerine ilgili varlık alanlarını aynı sorguya ekleyin.
  • Sık erişilen verileri önbelleğe alma – API çağrılarını azaltmak için statik başvuru verilerini bellekte depolayın.

Mevcut sınırlamalar

  • count() yöntemi akıcı istemcide kullanılamaz. Bunun yerine en az alanı seçin ve kullanın results.length .
  • Çoktan çoğa ilişkiler desteklenmez. İki @one() gezinti dekoratörüyle açık bir bağlantı varlığı kullanın.
  • totalCount üzerindeki PagedResult özelliği arka uç tarafından doldurulmuyor.