GraphQL.cz/Fórum/Jak udělat stránkování v GraphQL?

Jak udělat stránkování v GraphQL?

Zdravím všechny, mám tady takový dotaz ohledně GraphQL a stránkování. Snažím se pochopit, jak správně implementovat stránkování v GraphQL, protože jsem narazil na několik různých přístupů a trochu se v tom ztrácím. Chápu, že v REST API je to většinou jednoduché pomocí parametrů jako page a limit, ale jak to funguje v GraphQL? Je pravda, že GraphQL nabízí flexibilitu a tak nějak se to dá udělat i jinak? Viděl jsem, že někteří lidé používají tzv. cursor-based pagination, což vypadá zajímavě, ale nevím, jak to přesně nastavit. Můžete mi prosím poradit, co všechno potřebuju k tomu, abych to správně udělal? Jaké pole bych měl mít v schématu a jak sestavit dotaz pro získání konkrétní stránky dat? A co třeba paginace s filtry nebo seřazením? Jak to všechno dát dohromady? Zkrátka bych potřeboval nějaký přehledný návod nebo tipy, jak na to, abych se vyhnul běžným chybám. Děkuji moc za pomoc!

148 slov
1.5 minut čtení
21. 2. 2021
Žaneta Palečková

Stránkování v GraphQL můžeš udělat víc způsoby. Nejčastější jsou cursor-based a offset-based. Cursor-based je super, když chceš mít stabilní stránkování, i když se data mění. V tomhle případě potřebuješ nějaký unikátní identifikátor pro každý záznam, třeba ID. Když se pak dotazuješ, pošleš kurzor (např. poslední ID z předchozí stránky) a počty položek, co chceš vidět.

V schématu si nastavíš typy jako PageInfo (pro info o stránkování) a edges s jednotlivými položkami. V dotazu pak budeš mít něco jako first, after, last, before pro navigaci mezi daty.

Offset-based je vlastně podobné jako v REST, kdy posíláš page a limit. Ale to není tak robustní jako cursor-based. Co se týká filtrů a řazení, můžeš prostě přidat další argumenty do svého dotazu a podle toho pak ta data ve backendu upravit.

Takže si to promysli, zvol správný přístup podle potřeby tvé aplikace a začni s tím schématem. Pak už jen dotazuj a testuj.

148 slov
1.5 minut čtení
23. 5. 2023
Viktor Polák

Pokud chceš udělat stránkování v GraphQL, tak je fajn použít cursor-based pagination. Je to lepší než ten klasický page/limit, protože to funguje líp s dynamicky se měnícími daty. Takže v tvém schématu bys mohl mít typ, co vrátí data a nějaké info o stránkování jako třeba hasNextPage, startCursor, endCursor. Dotaz by pak mohl vypadat nějak takhle:

query GetItems($first: Int, $after: String) \{
  items(first: $first, after: $after) \{
    edges \{
      node \{
        id
        name
      \}
      cursor
    \}
    pageInfo \{
      hasNextPage
      endCursor
    \}
  \}
\}

Když to voláš, tak do first dáš počet položek, co chceš a do after ten cursor z předchozí stránky. K tomu můžeš samozřejmě přidat i filtry a seřazení – prostě přidej další argumenty do dotazu a pak to zpracuj na serveru.

Takhle můžeš snadno projíždět data bez toho, aby ses musel bát, že něco ztratíš při paginaci. Kdybys měl nějaký další dotazy ohledně implementace nebo konkrétních příkladů, dej vědět.

201 slov
2 minut čtení
24. 10. 2023
Bohuslav Kotek

Stránkování v GraphQL můžeš udělat různě, ale nejčastěji se používá cursor-based pagination, která je efektivnější než klasické page/limit. V podstatě místo stránek to děláš pomocí kurzorů, což ti umožní lépe pracovat s dynamickými daty.

V tvém schématu bys měl mít typ pro výsledky, který by obsahoval pole jako edges a pageInfo. edges je pole, které obsahuje jednotlivé položky a jejich kurzory, a pageInfo ti dá info o tom, jestli jsou další stránky nebo už jsi na konci. Může to vypadat nějak takhle:

type PageInfo \{
  hasNextPage: Boolean!
  endCursor: String
\}

type Item \{
  id: ID!
  name: String!
\}

type ItemEdge \{
  node: Item!
  cursor: String!
\}

type ItemConnection \{
  edges: [ItemEdge]
  pageInfo: PageInfo!
\}

Pak při dotazu můžeš použít něco jako first nebo after, aby ses dostal na konkrétní část. Například:

query GetItems($first: Int, $after: String) \{
  items(first: $first, after: $after) \{
    edges \{
      node \{
        id
        name
      \}
      cursor
    \}
    pageInfo \{
      hasNextPage
      endCursor
    \}
  \}
\}

To ti umožní získat jen určité položky a pak podle endCursor posunout dál.

Pokud chceš přidat filtry nebo třídění, můžeš do dotazu přidat další argumenty třeba filter nebo sort. To záleží jak máš backend nastavený. Většina knihoven pro GraphQL tohle podporuje.

Takže zkus začít s těmito základními koncepty a pak to můžeš vylepšit podle svých potřeb.

263 slov
2.6 minut čtení
23. 1. 2021
Zdeněk Kadlec
GraphQL.cz/Články/Pokročilé GraphQL dotazy
Pokročilé techniky pro stránkování dat v GraphQLObjevte pokročilé techniky stránkování dat v GraphQL a naučte se, jak efektivně načítat velké objemy informací pomocí různých strategií.
1000 slov
10 minut čtení
11. 2. 2020
Richard Kolář
Přečíst článek
Podobné otázky