Interrogare i dati
Accesso alle collezioni
Sezione intitolata “Accesso alle collezioni”Accedi a qualsiasi collezione tramite client.data.<collectionName> (camelCase, convertito automaticamente in snake_case) o client.data.collection<Record<string, unknown>>("slug") (slug esplicito):
// Property-style access (camelCase → snake_case slug)client.data.blogPosts // → slug "blog_posts"client.data.users // → slug "users"
// Dynamic access by slugclient.data.collection<Record<string, unknown>>("blog_posts")Modalità strict (SDK generato): Quando passi il
collectionsDictionarygenerato acreateRebaseClient, il proxy dei dati convalida gli accessi alle proprietà al momento dell’accesso. Un errore di battitura comeclient.data.prodcutsgenererà immediatamente un errore con un messaggio utile e un suggerimento sulla corrispondenza più vicina, invece di produrre un confuso 404 in seguito. Usaclient.data.collection<Record<string, unknown>>("slug")per ignorare la convalida con slug dinamici o determinati a runtime.
Operazioni CRUD
Sezione intitolata “Operazioni CRUD”Find (Elenca)
Sezione intitolata “Find (Elenca)”// All products (default limit: 20)const { data, meta } = await client.data.products.find();
// With pagination, filtering, and sortingconst { data, meta } = await client.data.products.find({ where: { active: ["==", true], price: [">=", 100] }, orderBy: ["created_at", "desc"], limit: 25, offset: 0});
// data is Entity<M>[] — each item has { id, values, path }// meta has { total, limit, offset, hasMore }Trova per ID
Sezione intitolata “Trova per ID”const product = await client.data.products.findById(42);// Returns Entity<M> | undefinedconst newProduct = await client.data.products.create({ name: "New Product", price: 29.99, active: true});
// With a specific IDconst newProduct = await client.data.products.create( { name: "Custom ID Product" }, "my-custom-id");Aggiornare
Sezione intitolata “Aggiornare”const updated = await client.data.products.update(42, { name: "Updated Name", price: 39.99});Eliminare
Sezione intitolata “Eliminare”await client.data.products.delete(42);Contare
Sezione intitolata “Contare”const total = await client.data.products.count();
// With filtersconst activeCount = await client.data.products.count({ where: { active: ["==", true] }});Query Builder fluido
Sezione intitolata “Query Builder fluido”Concatena i metodi per query più espressive:
const { data } = await client.data.products .where("price", ">=", 100) .where("active", "==", true) .orderBy("created_at", "desc") .limit(10) .find();Metodi disponibili
Sezione intitolata “Metodi disponibili”| Metodo | Descrizione | Esempio |
|---|---|---|
.where(field, op, value) |
Aggiunge una condizione di filtro | .where("age", ">=", 18) |
.orderBy(field, dir) |
Ordina i risultati | .orderBy("name", "asc") |
.limit(n) |
Limita il numero di risultati | .limit(25) |
.offset(n) |
Salta i primi N risultati | .offset(50) |
.search(text) |
Ricerca full-text | .search("laptop") |
.include(...relations) |
Include le entità correlate | .include("author", "tags") |
.find() |
Esegue la query | Restituisce FindResponse<M> |
.listen(onUpdate, onError?) |
Si iscrive agli aggiornamenti in tempo reale | Restituisce unsubscribe() |
Operatori di filtro
Sezione intitolata “Operatori di filtro”| Operatore | Alias | Descrizione |
|---|---|---|
"==" |
"eq" |
Uguale |
"!=" |
"neq" |
Diverso |
">" |
"gt" |
Maggiore di |
">=" |
"gte" |
Maggiore o uguale a |
"<" |
"lt" |
Minore di |
"<=" |
"lte" |
Minore o uguale a |
"in" |
Valore in un array | |
"not-in" |
"nin" |
Valore non in un array |
"array-contains" |
"cs" |
Il campo array contiene il valore |
"array-contains-any" |
"csa" |
Il campo array contiene uno dei valori |
Sintassi della clausola Where
Sezione intitolata “Sintassi della clausola Where”Il parametro where di find() supporta due formati:
// 1. Tuple syntax — [operator, value] (recommended)await client.data.products.find({ where: { status: ["==", "active"], featured: ["==", true], price: [">=", 100], category: ["in", ["electronics", "gadgets"]], deleted_at: ["!=", null] }});
// 2. Pre-serialized PostgREST string syntax (advanced)await client.data.products.find({ where: { status: "eq.published", price: "gte.100" }});Nota: Le stringhe PostgREST pre-serializzate (formato 2) sono una via di fuga per passare valori di filtro già in formato wire. Preferisci la sintassi a tuple per la sicurezza dei tipi e la leggibilità.
Paginazione
Sezione intitolata “Paginazione”// Offset-based paginationconst page1 = await client.data.products.find({ limit: 20, offset: 0 });const page2 = await client.data.products.find({ limit: 20, offset: 20 });
// Check if more pages existif (page1.meta.hasMore) { // fetch next page}
// Page-number pagination (1-indexed)const page = await client.data.products.find({ page: 2, limit: 20 });Ordinamento
Sezione intitolata “Ordinamento”// Sort by field (format: ["field", "direction"])const { data } = await client.data.products.find({ orderBy: ["created_at", "desc"]});
// Fluent styleconst { data } = await client.data.products .orderBy("price", "asc") .find();Ricerca full-text
Sezione intitolata “Ricerca full-text”// Via find paramsconst { data } = await client.data.products.find({ searchString: "wireless headphones"});
// Fluent styleconst { data } = await client.data.products .search("wireless headphones") .limit(10) .find();Caricamento delle relazioni
Sezione intitolata “Caricamento delle relazioni”Le relazioni possono essere incluse in modo che le entità correlate vengano restituite insieme ai dati principali, invece dei soli ID di chiave esterna.
Uso di include() (Fluido)
Sezione intitolata “Uso di include() (Fluido)”// Include specific relationsconst { data } = await client.data.posts .include("author", "categories") .find();
// Include all defined relationsconst { data } = await client.data.posts .include("*") .find();Uso di find({ include }) (Parametri)
Sezione intitolata “Uso di find({ include }) (Parametri)”const { data } = await client.data.posts.find({ include: ["author", "categories"]});Combinazione con i filtri
Sezione intitolata “Combinazione con i filtri”const { data } = await client.data.posts .where("status", "==", "published") .include("author") .orderBy("published_at", "desc") .limit(10) .find();Lettura dei dati delle relazioni
Sezione intitolata “Lettura dei dati delle relazioni”Quando le relazioni sono incluse, la risposta contiene sia la chiave esterna scalare sia l’oggetto relazione idratato:
const { data } = await client.data .collection<{ author_id: string; author?: { name: string } }>("posts") .include("author") .find();
for (const post of data) { // Scalar foreign key — always present console.log(post.author_id); // "uuid-1234"
// Hydrated relation — present when included console.log(post.author?.name); // "Jane Doe"}Nota: Senza
.include("author"), viene restituito solo il campo scalareauthor_id. L’oggettoauthoridratato saràundefined.
Nomi delle relazioni
Sezione intitolata “Nomi delle relazioni”I nomi di relazione che passi a include() devono corrispondere al relationName definito nell’array relations della collezione:
// Collection definitionrelations: [ { relationName: "author", target: () => usersCollection, ... }, { relationName: "categories", target: () => categoriesCollection, ... }]
// SDK usage — names must matchclient.data.articles.include("author", "categories").find()Endpoint personalizzati
Sezione intitolata “Endpoint personalizzati”Chiama endpoint server personalizzati registrati tramite il sistema di funzioni:
// Using client.functions.invoke()const result = await client.functions.invoke<{ summary: string }>( "generate-summary", { articleId: 42 });
// With optionsconst result = await client.functions.invoke<{ status: string }>( "process-order", { orderId: 123 }, { method: "POST", path: "status/check" });
// Shorthand via client.call()const result = await client.call<{ summary: string }>( "functions/generate-summary", { articleId: 42 });Prossimi passi
Sezione intitolata “Prossimi passi”- Autenticazione — Accesso, registrazione, OAuth, sessioni
- Sottoscrizioni in tempo reale — Dati in diretta con i WebSocket
- Archiviazione e file — Caricare, scaricare e gestire i file
- Relazioni — Definire relazioni tra collezioni
