Σημείωμα
Η πρόσβαση σε αυτήν τη σελίδα απαιτεί εξουσιοδότηση. Μπορείτε να δοκιμάσετε να εισέλθετε ή να αλλάξετε καταλόγους.
Η πρόσβαση σε αυτήν τη σελίδα απαιτεί εξουσιοδότηση. Μπορείτε να δοκιμάσετε να αλλάξετε καταλόγους.
Το Fabric Apps παρέχει ένα πρόγραμμα-πελάτη GraphQL ασφαλές για τον τύπο που σας επιτρέπει να εκτελείτε λειτουργίες δημιουργίας, ανάγνωσης, ενημέρωσης και διαγραφής χωρίς να γράφετε ακατέργαστα ερωτήματα. Ο πελάτης δημιουργεί αυτόματα το GraphQL από τις κλήσεις της μεθόδου σας και επιστρέφει δακτυλογραφημένες οντότητες με βάση τους ορισμούς του μοντέλου δεδομένων σας.
Προϋποθέσεις
- Ένα έργο Fabric Apps με καθορισμένα μοντέλα δεδομένων. Δείτε την ενότητα Ορισμός μοντέλων δεδομένων.
- Οι υπηρεσίες παρασκηνίου εκτελούνται τοπικά ή αναπτύσσονται στο Fabric.
Αρχικοποίηση του προγράμματος-πελάτη
Δημιουργήστε RayfinClient με τη διεύθυνση URL υποστήριξης, το κλειδί με δυνατότητα δημοσίευσης και τον τύπο σχήματος:
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',
});
Το όρισμα γενικού τύπου επιτρέπει στο TypeScript να παρέχει αυτόματη συμπλήρωση και έλεγχο τύπου για όλες τις λειτουργίες δεδομένων.
Ανάγνωση δεδομένων
Πρόσβαση σε συλλογές οντοτήτων μέσω client.data.<EntityName>. Το fluent API παρέχει μεθόδους για αναζήτηση, φιλτράρισμα, ταξινόμηση και σελιδοποίηση.
Λήψη όλων των εγγραφών
const notes = await client.data.Note.select([
'id',
'title',
'content',
'createdAt',
'isPinned',
]).execute();
Λήψη μεμονωμένης εγγραφής με πρωτεύον κλειδί
const note = await client.data.Note.findByPk('00000000-0000-0000-0000-000000000000');
Αυτό επιστρέφει την πλήρη οντότητα ή null , εάν δεν υπάρχει εγγραφή με αυτό το αναγνωριστικό.
Φιλτράρισμα εγγραφών
Χρησιμοποιήστε τη where() μέθοδο για να φιλτράρετε τα αποτελέσματα:
const pinnedNotes = await client.data.Note.select([
'id',
'title',
'isPinned',
])
.where({ isPinned: { eq: true } })
.execute();
Χειριστές φίλτρων
| Τελεστής | Περιγραφή | Παράδειγμα |
|---|---|---|
eq |
Ισούται με | { status: { eq: 'active' } } |
ne |
Δεν ισούται | { status: { ne: 'archived' } } |
gt |
Μεγαλύτερο από | { age: { gt: 18 } } |
gte |
Μεγαλύτερο από ή ίσο με | { age: { gte: 21 } } |
lt |
Μικρότερο από | { price: { lt: 100 } } |
lte |
Μικρότερο από ή ίσο με | { price: { lte: 50 } } |
contains |
Περιέχει υποσυμβολοσειρά | { title: { contains: 'draft' } } |
Ταξινόμηση αποτελεσμάτων
Χρήση orderBy() για την ταξινόμηση των αποτελεσμάτων ερωτημάτων:
const notes = await client.data.Note.select([
'id',
'title',
'createdAt',
])
.orderBy({ createdAt: 'desc' })
.execute();
Ταξινόμηση κατά πολλές στήλες:
const notes = await client.data.Note.select([
'id',
'title',
'isPinned',
'createdAt',
])
.orderBy({ isPinned: 'desc' })
.orderBy({ createdAt: 'desc' })
.execute();
Περιήγηση στις σχέσεις
Όταν ορίζετε σχέσεις με @one() και @many() διακοσμητές, μπορείτε να συμπεριλάβετε σχετικά πεδία οντότητας στο ίδιο ερώτημα:
const notes = await client.data.Note.select([
'id',
'title',
'content',
'notebook.id',
'notebook.name',
'notebook.color',
])
.execute();
Κάθε σημείωση περιλαμβάνει τα συσχετισμένα δεδομένα σημειωματάριου χωρίς να απαιτείται ξεχωριστό ερώτημα.
Σελιδοποίηση μεγάλων συνόλων αποτελεσμάτων
Χρησιμοποιήστε σελιδοποίηση με βάση το δρομέα για μεγάλες λίστες:
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);
Ανακτήστε την επόμενη σελίδα χρησιμοποιώντας τον κέρσορα:
if (page.hasNextPage) {
const nextPage = await client.data.Note.select([
'id',
'title',
'createdAt',
])
.orderBy({ createdAt: 'desc' })
.first(25)
.after(page.endCursor)
.executePaginated();
}
Σημείωση
Η totalCount ιδιότητα εμφανίζεται στον PagedResult τύπο, αλλά δεν συμπληρώνεται από το παρασκήνιο. Χρησιμοποιήστε το items.length για να μετρήσετε τα αποτελέσματα στην τρέχουσα σελίδα.
Δημιουργία εγγραφών
Χρησιμοποιήστε τη create() μέθοδο για να εισαγάγετε νέες εγγραφές:
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',
});
Η μέθοδος επιστρέφει την οντότητα που δημιουργήθηκε με όλα τα πεδία συμπληρωμένα, συμπεριλαμβανομένου του αυτόματα δημιουργημένου id.
Δημιουργία καρτελών με σχέσεις
Κατά τη δημιουργία οντοτήτων που έχουν σχέσεις, μεταβιβάστε είτε το πλήρες σχετικό αντικείμενο είτε ένα αντικείμενο μόνο με το πρωτεύον κλειδί:
// 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(),
});
Και οι δύο μορφές παράγουν το ίδιο αποτέλεσμα. Χρησιμοποιήστε την πρώτη φόρμα όταν γνωρίζετε ήδη το αναγνωριστικό της σχετικής οντότητας και θέλετε να αποφύγετε μια επιπλέον ανάκτηση.
Ενημέρωση εγγραφών
Χρησιμοποιήστε τη update() μέθοδο για να τροποποιήσετε υπάρχουσες καρτέλες. Μεταβιβάστε ένα αντικείμενο φίλτρου και ένα αντικείμενο που περιέχει τα πεδία για ενημέρωση:
await client.data.Note.update(
{ id: 'note-123' },
{
title: 'Updated title',
updatedAt: new Date(),
}
);
Ενημέρωση σχέσεων
Για να αλλάξετε μια σχέση, μεταβιβάστε τη νέα σχετική οντότητα ή απλώς το αναγνωριστικό της:
// Move a note to a different notebook
await client.data.Note.update(
{ id: 'note-123' },
{ notebook: { id: 'new-notebook-789' } }
);
Διαγραφή εγγραφών
Χρησιμοποιήστε τη delete() μέθοδο για να καταργήσετε καρτέλες που ταιριάζουν με ένα φίλτρο:
await client.data.Note.delete({ id: 'note-123' });
Η μέθοδος επιλύεται όταν το backend επιβεβαιώσει τη διαγραφή. Εάν καμία εγγραφή δεν ταιριάζει με το φίλτρο, η μέθοδος εξακολουθεί να είναι επιτυχής.
Χειρισμός ελέγχου ταυτότητας
Όταν είναι ενεργοποιημένος ο έλεγχος ταυτότητας, συνδεθείτε πριν εκτελέσετε λειτουργίες δεδομένων:
await client.auth.signIn({ email, password });
// All subsequent data calls include authentication context
const notes = await client.data.Note.select(['id', 'title']).execute();
Ο υπολογιστής-πελάτης επισυνάπτει αυτόματα την περίοδο λειτουργίας ελέγχου ταυτότητας σε όλες τις κλήσεις API δεδομένων. Δεν χρειάζεται να μεταβιβάσετε μάρκες με μη αυτόματο τρόπο.
Βέλτιστες πρακτικές
- Επιλογή μόνο των απαραίτητων πεδίων – Λήψη μόνο των πεδίων που χρησιμοποιείτε για μείωση του μεγέθους του ωφέλιμου φορτίου και βελτίωση της απόδοσης.
-
Χρήση σελιδοποίησης για μεγάλες λίστες – Αποφύγετε τη λήψη χιλιάδων εγγραφών ταυτόχρονα χρησιμοποιώντας
first()καιexecutePaginated(). - Ερωτήματα σχέσης δέσμης – Συμπεριλάβετε πεδία σχετικής οντότητας στο ίδιο ερώτημα αντί να κάνετε ξεχωριστές αιτήσεις.
- Προσωρινή αποθήκευση δεδομένων με συχνή πρόσβαση – Αποθηκεύστε στατικά δεδομένα αναφοράς στη μνήμη για να μειώσετε τις κλήσεις API.
Τρέχοντες περιορισμοί
- Η
count()μέθοδος δεν είναι διαθέσιμη στον άπταιστα πελάτη. Επιλέξτε ελάχιστα πεδία και χρησιμοποιήστεresults.lengthτα αντ' αυτού. - Οι σχέσεις πολλά-προς-πολλά δεν υποστηρίζονται. Χρησιμοποιήστε μια ρητή οντότητα σύνδεσης με δύο
@one()διακοσμητές πλοήγησης. - Το
totalCountακίνητο δενPagedResultκατοικείται από το backend.