Datan lukeminen ja kirjoittaminen GraphQL:llä Fabric Appsissa

Fabric Apps tarjoaa tyyppiturvallisen GraphQL-asiakasohjelman, jonka avulla voit suorittaa luomis-, luku-, päivitys- ja poistotoimintoja ilman raakakyselyiden kirjoittamista. Asiakas generoi GraphQL:n automaattisesti metodikutsuistasi ja palauttaa tyypitetyt entiteetit datamallin määritelmien perusteella.

Edellytykset

  • Fabric Apps -projekti, jossa on määritelty datamallit. Katso Määrittele tietomallit.
  • Backend-palvelut toimivat paikallisesti tai Fabric-palveluissa.

Alusta asiakas

Käynnistä RayfinClient backend-URL-osoitteesi, julkaistava avain ja skeematyyppi:

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',
});

Yleinen tyyppiargumentti mahdollistaa TypeScriptin automaattisen täydennyksen ja tyypintarkistuksen kaikille dataoperaatioille.

Tietojen lukeminen

Pääsy entiteettikokoelmiin kautta client.data.<EntityName>. Fluent API tarjoaa menetelmiä kyselyihin, suodatuksiin, lajitteluun ja sivuttamiseen.

Hae kaikki tiedot

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

Hae yksi tietue ensisijaisen avaimen mukaan

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

Tämä palauttaa koko yksikön tai null jos kyseistä tunnistetta ei ole olemassa.

Suodatintietueet

Käytä menetelmää where() tulosten suodattamiseen:

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

Suodatinoperaattorit

Operaattori Description Esimerkki
eq Yhtä suuri kuin { status: { eq: 'active' } }
ne Ei tasa-arvoisia { status: { ne: 'archived' } }
gt Suurempi kuin { age: { gt: 18 } }
gte Suurempi tai yhtä suuri kuin { age: { gte: 21 } }
lt Pienempi kuin { price: { lt: 100 } }
lte Pienempi tai yhtä suuri kuin { price: { lte: 50 } }
contains Sisältää alijonon { title: { contains: 'draft' } }

Lajittele tulokset

Käytä orderBy() kyselytulosten lajittelua:

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

Lajittele useiden sarakkeiden mukaan:

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

Kun määrittelet suhteita ja @one()@many() koristelijoiden kanssa, voit sisällyttää samaan kyselyyn liittyvät entiteettikentät:

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

Jokainen muistiinpano sisältää siihen liittyvän muistikirjan tiedot ilman erillistä kyselyä.

Suuret tulosjoukot paginoi

Käytä kursoripohjaista sivutusta suurissa listoissa:

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);

Hae seuraava sivu osoittimella:

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

Note

Ominaisuus totalCount näkyy tyypissä PagedResult , mutta sitä ei täytä taustajärjestelmä. Käytä items.length tuloksia laskemaan nykyiselle sivulle.

Luo tietueita

Käytä menetelmää create() uusien tietueiden lisäämiseen:

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',
});

Metodi palauttaa luodun olennon kaikkien kenttien täytettyinä, mukaan lukien automaattisesti generoitu id.

Luo tietueita suhteilla

Kun luodaan entiteettejä, joilla on suhteita, välitä joko koko siihen liittyvä olio tai olio, jolla on vain pääavain:

// 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(),
});

Molemmat muodot tuottavat saman lopputuloksen. Käytä ensimmäistä lomaketta, kun tiedät jo kyseisen yksikön tunnuksen ja haluat välttää ylimääräisen noudon.

Päivitä tilastot

Käytä menetelmää update() muokkaaaksesi olemassa olevia tietueita. Välitä suodatinobjekti ja objekti, joka sisältää kentät päivitettäväksi:

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

Päivitä suhteet

Suhteen muuttamiseksi anna uusi liittyvä taho tai pelkkä sen tunnus:

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

Poista tietueet

Käytä delete() menetelmää poistaaksesi tietueet, jotka vastaavat suodatinta:

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

Menetelmä ratkeaa, kun taustajärjestelmä vahvistaa poiston. Jos mikään tietue ei vastaa suodatinta, menetelmä onnistuu silti.

Käsittele todennus

Kun todennus on käytössä, kirjaudu sisään ennen datatoimintojen suorittamista:

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

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

Asiakas liittää tunnistautumisistunnon automaattisesti kaikkiin data-API-kutsuihin. Sinun ei tarvitse siirtää tokeneita manuaalisesti.

Parhaat käytännöt

  • Valitse vain tarvittavat kentät – Hae vain ne kentät, joita käytät hyötykuorman pienentämiseksi ja suorituskyvyn parantamiseksi.
  • Käytä sivuttamista suurissa listoissa – Vältä tuhansien tietueiden hakemista kerralla käyttämällä first() ja executePaginated().
  • Eräaikaiset suhdekyselyt – Sisällytä siihen liittyvät entiteettikentät samaan kyselyyn sen sijaan, että tekisit erillisiä pyyntöjä.
  • Välimuisti usein käytetty data – Tallenna staattinen viitedata muistiin API-kutsujen vähentämiseksi.

Nykyiset rajoitukset

  • Menetelmää count() ei ole saatavilla sujuvalle asiakkaalle. Valitse minimikentät ja käytä results.length sen sijaan.
  • Moni-to-monen suhteita ei tueta. Käytä eksplisiittistä liitosyksikköä kahden @one() navigointisisustelijan kanssa.
  • Alueella totalCount oleva kiinteistö PagedResult ei ole taustajärjestelmän täyttämä.