Adatok olvasása és írása a GraphQL használatával az Fabric Appsben

Fabric Alkalmazások típusbiztos GraphQL-ügyfelet biztosít, amellyel nyers lekérdezések írása nélkül végezhet létrehozási, olvasási, frissítési és törlési műveleteket. Az ügyfél automatikusan létrehozza a GraphQL-t a metódushívásokból, és gépelt entitásokat ad vissza az adatmodell definíciói alapján.

Prerequisites

  • Egy Fabric Apps-projekt definiált adatmodellekkel. Lásd: Adatmodellek definiálása.
  • A helyileg futó vagy a Fabric üzembe helyezett háttérszolgáltatások.

Az ügyfél inicializálása

Példányosítsa a(z) RayfinClient elemet a backend URL-jével, a publikálható kulccsal és a sématípussal:

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

Az általános típusargumentum lehetővé teszi, hogy a TypeScript automatikus kiegészítést és típusellenőrzést biztosítson az összes adatművelethez.

Adatok beolvasása

Az entitásgyűjtemények elérése client.data.<EntityName> keresztül. A fluent API metódusokat biztosít a lekérdezéshez, szűréshez, rendezéshez és lapozáshoz.

Az összes rekord lekérése

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

Egyetlen rekord lekérése elsődleges kulcs szerint

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

Ez a teljes entitást adja vissza, vagy null ha nincs ilyen azonosítójú rekord.

Rekordok szűrése

Az eredmények szűréséhez használja a where() metódust:

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

Operátorok szűrése

Operator Leírás Example
eq Equals { status: { eq: 'active' } }
ne Nem egyenlő { status: { ne: 'archived' } }
gt Nagyobb, mint { age: { gt: 18 } }
gte Nagyobb vagy egyenlő { age: { gte: 21 } }
lt Kevesebb, mint { price: { lt: 100 } }
lte Kisebb vagy egyenlő { price: { lte: 50 } }
contains Részkarakterláncot tartalmaz { title: { contains: 'draft' } }

Az eredmények rendezése

A(z) orderBy() használatával rendezheti a lekérdezés eredményeit:

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

Rendezés több oszlop szerint:

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

Amikor a kapcsolatokat a @one() és @many() dekorátorokkal definiálja, ugyanabban a lekérdezésben a kapcsolódó entitások mezőit is felveheti:

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

Minden jegyzet külön lekérdezés nélkül tartalmazza a kapcsolódó jegyzetfüzet-adatokat.

Nagy eredményhalmazok lapozása

Használjon kurzoralapú lapozást nagy listákhoz:

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

A következő lap beolvasása a kurzor használatával:

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

Megjegyzés:

A totalCount tulajdonság megjelenik a PagedResult típuson, de a háttérrendszer nem tölti ki. Az aktuális lapon lévő eredmények megszámlálására használható items.length .

Rekordok létrehozása

Új rekordok beszúrása a create() metódus használatával:

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

A metódus a létrehozott entitást adja vissza az összes kitöltött mezővel, beleértve az automatikusan létrehozott entitást idis.

Rekordok létrehozása kapcsolatokkal

Kapcsolatokkal rendelkező entitások létrehozásakor adja át a teljes kapcsolódó objektumot, vagy csak az elsődleges kulccsal rendelkező objektumot:

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

Mindkét űrlap ugyanazt az eredményt hozza létre. Az első űrlapot akkor használja, ha már ismeri a kapcsolódó entitás azonosítóját, és el szeretné kerülni a további beolvasást.

Rekordok frissítése

A metódus használatával update() módosíthatja a meglévő rekordokat. Adjon át egy szűrőobjektumot és egy, a frissíteni kívánt mezőket tartalmazó objektumot:

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

Kapcsolatok frissítése

Egy kapcsolat módosításához adja át az új kapcsolódó entitást vagy csak annak azonosítóját:

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

Rekordok törlése

A módszerrel eltávolíthatja a delete() szűrőnek megfelelő rekordokat:

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

A metódus akkor szűnik meg, ha a háttérrendszer megerősíti a törlést. Ha egyetlen rekord sem egyezik a szűrővel, a metódus továbbra is sikeres lesz.

Hitelesítés kezelése

Ha a hitelesítés engedélyezve van, jelentkezzen be az adatműveletek végrehajtása előtt:

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

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

Az ügyfél automatikusan csatolja a hitelesítési munkamenetet az összes adat API-híváshoz. Nem kell manuálisan megadnod a tokeneket.

Bevált gyakorlatok

  • Csak a szükséges mezőket válassza ki – Az adatcsomag méretének csökkentése és a teljesítmény javítása érdekében csak azokat a mezőket kérje le, amelyeket használ.
  • Használjon lapozást nagy listákhoz – Kerülje el, hogy egyszerre több ezer rekordot kérjen le a first() és executePaginated() használatával.
  • Kötegkapcsolati lekérdezések – A kapcsolódó entitásmezők belefoglalása ugyanabba a lekérdezésbe ahelyett, hogy külön kéréseket készítenek.
  • A gyakran használt adatok gyorsítótárazása – A statikus referenciaadatokat tárolja a memóriában az API-hívások csökkentése érdekében.

Jelenlegi korlátozások

  • A count() módszer nem érhető el a fluent ügyfélen. Jelöljön ki minimális mezőket, és használjon results.length helyette.
  • A több-a-többhöz kapcsolatok nem támogatottak. Használjon explicit kapcsolóentitást két @one() navigációs deklarátorral.
  • A(z) PagedResulttotalCount tulajdonságát a háttérrendszer nem tölti fel.