logo

GraphQL クエリ

GraphQL を使用すると、省略形と長い形式の両方でクエリを作成できます。

検索クエリについて、詳しくは以下をご覧ください。

GraphQL クエリ キーワードについて、詳しくは以下をご覧ください。

ID で検索

ID で検索は、ID に一致するエンティティである単一の結果を返します。

次の例では、Asset.alexander-mils-667996 という ID を M.Asset 上で検索します。戻りフィールドには、fileNametitle、およびcreatedOn の日付があります。

{
  m_Asset(id: "asset.alexander-mils-667996") {
    fileName
    title
    createdOn
  }
}

結果は次のとおりです。

{
  "data": {
    "m_Asset": {
      "fileName": "alexander-mils-667996.jpg",
      "title": "Elderflower cordial",
      "createdOn": "2021-02-02T00:34:47.000Z"
    }
  }
}

クエリの形状が、結果とまったく同じであることがすぐにわかるでしょう。 この形状が GraphQL の基本です。常に期待どおりの結果が得られ、サーバーは要求されたフィールドを認識しているためです。 fileName には string 型が返されます。この場合はエンティティの名前 M.Asset の ID asset.alexander-mils-667996 が返されています。

定義による検索

定義による検索は、検索されたエンティティに基づいて結果セットを返します。

この例では、M.Content のすべてを検索し (単一の結果ではなく)、idcontent_Name の戻りフィールドを要求します。

{
  allM_Content {
    results {
      id
      content_Name
    }
  }
}

結果は次のとおりです。

{
  "data": {
    "allM_Content": {
      "results": [
        {
          "id": "tTMVYivL2UyM3300lnraRQ",
          "content_Name": "Fruitful Summer (gb)"
        },
        {
          "id": "LB0MQmR3U0ST9NX2V4L_vA",
          "content_Name": "Fruitful Summer (es)"
        },
        {
          "id": "TmYSxnfrqUWL1-1VEL-ZdA",
          "content_Name": "Fruitful Summer (us)"
        },
        {
          "id": "Content.PowerofProtein",
          "content_Name": "The Power of Protein"
        },
        {
          "id": "Content.Snacking",
          "content_Name": "Snacking"
        },
        {
          "id": "Content.SalsaWithFruitChips",
          "content_Name": "Flavorful's famous salsa with Healthful fruit chips"
        }
      ]
    }
  }
}

インターフェイスで検索

インターフェイスは、宣言された共通フィールドがある抽象型です。 インターフェイスを実装するすべての型は、名前と型が完全に一致するすべてのフィールドを定義する必要があります。 インターフェイスの実装は、可能な型で明示的にリストされています。

次の例は、コンテンツの名前に Fruitful EmailFruitful BlogHealthy Mimosa のいずれかを含む M.Content を検索します。

結果には、コンテンツ名フィールド、仮想コンテンツのブログ型のブログ タイトルと本文フィールド、および仮想電子メール型の電子メールの件名と本文フィールドが含まれます。この包含は、クエリの ... on [Type] で型を付加し、サブクエリを作成することで行います。

query contentEmailBlogInterface {
  allM_Content(
    where: {
      OR: [
        { content_Name_contains: "Fruitful Email" }
        { content_Name_contains: "Fruitful Blog" }
        { content_Name_contains: "Healthy Mimosa" }
      ]
    }
  ) {
    total
    results {
      content_Name
      ... on M_Content_Blog {
        blog_Title
        blog_Body
      }
      ... on M_Content_Email {
        email_Subject
        email_Body
      }
    }
  }
}

結果は次のとおりです。

{
  "data": {
    "allM_Content": {
      "total": 5,
      "results": [
        {
          "content_Name": "Fruitful Blog",
          "blog_Title": "Fruitful juices",
          "blog_Body": "<figure class=\"image\"><img width=\"150\" alt=\"Fruitful logo (black)\" src=\"https://stylelabsdemo.com/api/public/content/363909544a354d3b9a4549c306c88bbe?v=ad464f64\"></figure><p><br/>&nbsp;</p><p><i><strong>Un tonto se cree sabio, pero un hombre sabio sabe que es un tonto.</strong></i></p><figure class=\"image\"><img width=\"200\" alt=\"Fruitful Orange mocktail\" src=\"https://stylelabsdemo.com/api/public/content/0268acbebdb643aa83d918ff8d03283d?v=f3607a38\"></figure><p style=\"text-align:center;\">&nbsp;</p><p style=\"text-align:center;\">&nbsp;</p><p><i><strong>Más valen tres horas adelantadas que un minuto tarde.</strong></i></p>"
        },
        {
          "content_Name": "Fruitful Email (es-ES)",
          "email_Subject": "Fruitful juices",
          "email_Body": "<figure class=\"image\"><img width=\"150\" alt=\"Fruitful logo (inverted)\" src=\"https://stylelabsdemo.com/api/public/content/5b2a9683096b4543b997346c15bda790?v=b426739c\"></figure><p><i><strong>Los cobardes mueren muchas veces antes de su muerte; los valientes nunca sienten la muerte sino sólo una vez</strong></i></p><figure class=\"image\"><img width=\"380\" alt=\"Lime mocktail with lime slice\" src=\"https://stylelabsdemo.com/api/public/content/99c986d065aa45fda3a692e0e27d3928?v=45b06955\"></figure><p><i><strong>El infierno está vacío y todos los demonios están aquí.</strong></i></p>"
        },
        {
          "content_Name": "Fruitful Email",
          "email_Subject": "Fruitful juices",
          "email_Body": "<figure class=\"image\"><img width=\"150\" src=\"https://stylelabsdemo.com/api/public/content/5b2a9683096b4543b997346c15bda790?v=b426739c\" alt=\"Fruitful logo (inverted)\"></figure><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque non ipsum mattis, elementum velit maximus, mattis eros.&nbsp;</p><figure class=\"image\"><img srcset=\"https://stylelabsdemo.com/api/public/content/99c986d065aa45fda3a692e0e27d3928?v=45b06955&amp;t=w320 320w\" width=\"380\" src=\"https://stylelabsdemo.com/api/public/content/99c986d065aa45fda3a692e0e27d3928?v=45b06955\" alt=\"Lime mocktail with lime slice\"></figure><p>Etiam cursus viverra ante eu faucibus. Ut porttitor.</p><p>&nbsp;</p>"
        },
        {
          "content_Name": "Fruitful Blog",
          "blog_Title": "Fruitful juices",
          "blog_Body": "<figure class=\"image\"><img width=\"150\" src=\"https://stylelabsdemo.com/api/public/content/363909544a354d3b9a4549c306c88bbe?v=ad464f64\" alt=\"Fruitful logo (black)\"></figure><p><br/>&nbsp;</p><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p><figure class=\"image\"><img width=\"200\" src=\"https://stylelabsdemo.com/api/public/content/0268acbebdb643aa83d918ff8d03283d?v=f3607a38\" alt=\"Fruitful Orange mocktail\"></figure><p style=\"text-align:center;\">&nbsp;</p><p style=\"text-align:center;\">&nbsp;</p><p>&nbsp;</p>"
        },
        {
          "content_Name": "Healthy Mimosa blog",
          "blog_Title": "Who wants a mimosa?!",
          "blog_Body": "<p>I do, always! Mimosas are supremely simple bubbly cocktails made with sparkling wine and orange juice. They're light, fizzy and easy to sip.</p><p>I love ordering mimosas at weekend brunch, and serving them to family and friends on holidays—Easter, Mother's Day, July 4th, Christmas, you name it. Mimosas liven up wedding showers and baby showers. I bring mimosa supplies to football watch parties, and no one complains. I've shared a few variations on mimosas over the years. Today, I'm going to share everything you've ever wanted to know about mimosas, plus a basic mimosa recipe and variations. If you haven't poured your first mimosa yet, you'll be a mimosa expert by the end of this post! If you're a seasoned mimosa drinker, I think you'll find some new tips here, too.</p><p>&nbsp;</p><p><span class=\\\"text-big\\\"><strong>Mimosa Ingredients:</strong></span></p><p>Classic mimosas require just two ingredients: dry sparkling wine, and orange juice. Some recipes will tell you to add some other alcohol or orange liqueur. Don't listen to them!</p><p><strong>Sparkling Wine</strong></p><p>The best Champagne for mimosas isn't actually Champagne. For mimosas, opt for less-expensive Cava or Prosecco. Cava is from Spain and Prosecco is from Italy, but they're both delicious dry sparkling wines that mix well with juice. Bonus? They're affordable. A good bottle of Cava or Prosecco will run about $12 to $16. Avoid super cheap sparkling wine, unless you want a headache with your mimosas. Don't waste your pricy bottle of Champagne on mimosas, since we're diluting those delicate notes with orange juice.</p><p><strong>Orange Juice</strong></p><p>Cold, fresh orange juice is best for mimosas. If you're buying orange juice at the store, opt for high-quality such as the Fruitful Orange Juice!</p><p><strong>Mimosa Ratio</strong></p><p>The perfect ratio of sparkling wine to orange juice is up to you. My suggestion? Start with the 50/50 ratio suggested below and adjust from there. I make my mimosas with 2 parts sparkling wine and 1 part orange juice—they're light, fizzy, and pack a punch. That's how we made them when I was a bartender. If you like sweeter, more juicy mimosas, start with a 50/50 ratio and add more orange juice if desired. After some delicious experimentation, you'll know exactly how you like your mimosas!</p>"
        }
      ]
    }
  }
}

合計

total 関数は、指定した基準に一致するエンティティの数を返します。

次の例では基準を指定していないため、クエリは * M.Content* のエンティティの総数を返します。

{
  allM_Content {
    total
  }
}

結果は以下のとおりで、* M.Content* のアイテムが合計 23 件返されます。

{
  "data": {
    "allM_Content": {
      "total": 23
    }
  }
}

Where

where 句は結果の数を制限します。 where 条件には、ANDOR などの論理演算子や、次のような比較演算子を併用できます。

AND 論理演算子を使用する場合は、すべての条件を満たす必要があります。 OR 論理演算子を使用する場合は、いずれかの条件を満たすものが返されます。

Equal to

次の例では、_eq 構文を使って、M.ContentpublishStatusUpdatingPublishStatus に等しいものを検索します。

{
  allM_Content(where: {publishStatus_eq: "UpdatingPublishStatus"}) {
    total
    results {
      content_Name
      publishStatus
    }
  }
}

結果は次のとおりです。

{
  "data": {
    "allM_Content": {
      "total": 3,
      "results": [
        {
          "content_Name": "Fruitful Summer (gb)",
          "publishStatus": "UpdatingPublishStatus"
        },
        {
          "content_Name": "Fruitful Summer (es)",
          "publishStatus": "UpdatingPublishStatus"
        },
        {
          "content_Name": "Fruitful Summer (us)",
          "publishStatus": "UpdatingPublishStatus"
        }
      ]
    }
  }
}

Not equal to

次の例では、_neq 構文を使って、publishStatusnull に等しくないものを検索します。

{
  allM_Content(where: {publishStatus_neq: null}){
    total
    results {
      content_Name
      publishStatus
    }
  }
}

結果は次のとおりです。

{
  "data": {
    "allM_Content": {
      "total": 3,
      "results": [
        {
          "content_Name": "Fruitful Summer (gb)",
          "publishStatus": "NotPublished"
        },
        {
          "content_Name": "Fruitful Summer (es)",
          "publishStatus": "NotPublished"
        },
        {
          "content_Name": "Fruitful Summer (us)",
          "publishStatus": "NotPublished"
        }
      ]
    }
  }
}

含む

contains 述語を WHERE 句で使用すると、文字ベースのデータ型を含むフルテキスト列で全文検索を行うことができます。contains は単語またはフレーズを検索します。

次の例では、M.ContentFruitful という単語が含まれるコンテンツ名を検索します。

{
  allM_Content(where: { content_Name_contains: "Fruitful" }) {
    total
    results {
      content_Name
      publishStatus
      m_Content_IsVariant
    }
  }
}

結果は次のとおりです。

{
  "data": {
    "allM_Content": {
      "total": 7,
      "results": [
        {
          "content_Name": "Sparkling Punch using Fruitful Orange",
          "publishStatus": "NotPublished",
          "m_Content_IsVariant": null
        },
        {
          "content_Name": "Fruitful Summer (us)",
          "publishStatus": "NotPublished",
          "m_Content_IsVariant": true
        },
        {
          "content_Name": "Fruitful Summer (gb)",
          "publishStatus": "NotPublished",
          "m_Content_IsVariant": true
        },
        {
          "content_Name": "Fruitful Summer (es)",
          "publishStatus": "NotPublished",
          "m_Content_IsVariant": null
        },
        {
          "content_Name": "Fruitful refreshing ginger lemonade",
          "publishStatus": null,
          "m_Content_IsVariant": null
        },
        {
          "content_Name": "Fruitful Cocktails",
          "publishStatus": null,
          "m_Content_IsVariant": null
        },
        {
          "content_Name": "Fruitful Mocktails",
          "publishStatus": null,
          "m_Content_IsVariant": null
        }
      ]
    }
  }
}

ここには、他のパラメーターを追加できます。次に例を示します。

  • [fieldname]_contains: 文字列フィールドにサブ文字列が含まれる結果をフィルタリングします。
  • [fieldname]_in: リストをチェックして、フィールドの値が指定したリスト内の任意のサブ文字列と一致するレコードを返します。
  • [fieldname]_starts_with: 指定したサブ文字列で始まる値をチェックする式です。
  • [fieldname]_ends_with: 上記の式と同様に、指定したサブ文字列で終わる値を検索します。

また、reverse ステートメントを使用してリストにさらに追加することもできます (逆の結果を返すため)。 たとえば、[fieldname]_not_contains[fieldname]_contains の反対です。

Order by

orderBy キーワードを使用すると、結果セットを昇順または降順で並べ替えます。

次の例では、クエリはレシピのタイトルで結果を昇順に並べ替えています。

{
  allM_Content_Recipe(
    where: { recipe_Title_contains: "Fruitful" }
    orderBy: RECIPE_TITLE_ASC
  ) {
    total
    results {
      recipe_Title
     }
  }
}

結果は次のとおりです。

{
  "data": {
    "allM_Content_Recipe": {
      "total": 4,
      "results": [
        {
          "recipe_Title": "Fruitful mango mocktail"
        },
        {
          "recipe_Title": "Fruitful refreshing ginger lemonade as an alternative to soda"
        },
        {
          "recipe_Title": "Fruitful's famous salsa with Healthful fruit chips"
        },
        {
          "recipe_Title": "Sparkling Punch using Fruitful Orange"
        }
      ]
    }
  }
}

論理演算子

フィルターを ANDOR 論理演算子で囲むことができます。

AND

AND 演算子は、AND で区切られているすべての条件が TRUE であるレコードを返します。

この例のクエリは、M.Content のうち、コンテンツ名に Healthy Mimosa が含まれ、公開ステータスが UpdatingPublishStatus に等しい結果が返されます。

{
  allM_Content(
    where: {
      AND: [
        { content_Name_contains: "Healthy Mimosa" }
        { publishStatus_eq: "UpdatingPublishStatus" }
      ]
    }
  ) {
    total
    results {
      content_Name
      publishStatus
    }
  }
}

結果は次のとおりです。

{
  "data": {
    "allM_Content": {
      "total": 1,
      "results": [
        {
          "content_Name": "Healthy Mimosa blog",
          "publishStatus": "UpdatingPublishStatus"
        }
      ]
    }
  }
}

OR

OR 演算子は、OR で区切られているいずれかの条件が TRUE であるレコードを返します。 以下に例を示します。

{
  allM_Content(
    where: {
      OR: [
        { content_Name_contains: "The Power of Protein" }
        { content_Name_contains: "Healthy Mimosa" }
      ]
    }
  ) {
    total
    results {
      content_Name
    }
  }
}

結果は次のとおりです。

{
  "data": {
    "allM_Content": {
      "total": 2,
      "results": [
        {
          "content_Name": "The Power of Protein"
        },
        {
          "content_Name": "Healthy Mimosa blog"
        }
      ]
    }
  }
}

OR を入れ子にした AND

ANDOR 演算子は入れ子にできます。

次のクエリは、名前に Summer が含まれており、AND は変数として NotPublished であるか、OR でそれ以外に 2021-02-05T14:11:50.000Z のいずれかである結果を返します。

{
  allM_Content(
    where: {
      AND: [
        { content_Name_contains: "Summer" }
        { m_Content_IsVariant_eq: true }
      ]
      OR: [
        { publishStatus_eq: "NotPublished" }
        { createdOn_eq: "2021-02-05T14:11:50.000Z" }
      ]
    }
  ) {
    total
    results {
      content_Name
      m_Content_IsVariant
      publishStatus
      createdOn
    }
  }
}

結果は次のとおりです。

{
  "data": {
    "allM_Content": {
      "total": 3,
      "results": [
        {
          "content_Name": "Summer 2018 Blog (en-GB)",
          "m_Content_IsVariant": true,
          "publishStatus": "Published",
          "createdOn": "2021-02-05T14:22:12.000Z"
        },
        {
          "content_Name": "Summer Mimosa",
          "m_Content_IsVariant": true,
          "publishStatus": "NotPublished",
          "createdOn": "2021-02-05T14:11:50.000Z"
        },
        {
          "content_Name": "Summer Mimosa",
          "m_Content_IsVariant": true,
          "publishStatus": "NotPublished",
          "createdOn": "2021-02-05T10:46:33.000Z"
        }
      ]
    }
  }
}

Typename

__typename フィールドは文字列に解決され、これにより、データ型とクライアントを区別できます。 以下に例を示します。

query typeName {
  allM_Content(where: {content_Name_contains: "Mimosa"})  {
    total
    results{
      content_Name
      __typename
    }
  }  
}

GraphQL の長い形式のクエリ

このクエリは構文 [your_query_name] から開始できます。 クエリには任意の名前を付けることができます。

そのクエリ内で、複数の個別のクエリに表示名を指定して実行することもできます。 構造は次のようになります。

query [your_query_name] {
  [subquery_name]: [model_name](where: {[your_criteria]}){
    [desired_field_name_1]
    [desired_field_name_2]
    [desired_field_name_3]
  }
}

次の例では、2 つのクエリが同時に実行されています。

  • blog という名前を付けた最初のクエリが仮想ブログ型を使用して M.Content を検索し、タイトルに Fruitful が含まれ、本文が null ではないブログを返します。 また、ブログのタイトルの昇順で結果を並べ替えます。

  • email という名前を付けた 2 つ目のクエリが仮想メール型を使用して M.Content を検索し、タイトルに Fruitful が含まれ、本文が null ではないブログを返します。 また、メールの型の昇順で結果を並べ替えます。

query contentEmailBlog {
  blog: allM_Content_Blog(
    where: { blog_Title_contains: "Fruitful", blog_Body_neq: null }
    orderBy: BLOG_TITLE_ASC
  ) {
    total
    results {
      blog_Title
      blog_Body
      blog_Quote
    }
  }

  email: allM_Content_Email(
    where: { email_Subject_contains: "Fruitful", email_Body_neq: null }
    orderBy: EMAIL_SUBJECT_ASC
  ) {
    total
    results {
      email_Subject
      email_Body
    }
  }
}

結果は次のとおりです (結果はグループ化されています)。

{
  "data": {
    "blog": {
      "total": 3,
      "results": [
        {
          "blog_Title": "Fruitful blog",
          "blog_Body": "<p>There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain. There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain. There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain</p><figure class=\"image\"><img width=\"1100\" alt=\"Refreshing mocktails\" src=\"https://stylelabsdemo.com/api/public/content/2ed85585609c43bda24ae92372a5f311?v=f4d87d58\"></figure>",
          "blog_Quote": "<p>The <strong>fruit</strong> of your own hard work is the sweetest.</p>"
        },
        {
          "blog_Title": "Fruitful blog",
          "blog_Body": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi pulvinar tellus non augue vestibulum vulputate. Proin non tortor vitae ante tincidunt dictum eget vitae tortor.</p><figure class=\"image\"><img width=\"1100\" alt=\"Refreshing mocktails\" src=\"https://stylelabsdemo.com/api/public/content/2ed85585609c43bda24ae92372a5f311?v=f4d87d58\"></figure>",
          "blog_Quote": "<p><br/>Le fruit de votre propre travail acharné est le plus doux.</p>"
        },
        {
          "blog_Title": "Fruitful blog",
          "blog_Body": "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi pulvinar tellus non augue vestibulum vulputate. Proin non tortor vitae ante tincidunt dictum eget vitae tortor.</p><figure class=\"image\"><img width=\"1100\" alt=\"Refreshing mocktails\" src=\"https://stylelabsdemo.com/api/public/content/2ed85585609c43bda24ae92372a5f311?v=f4d87d58\"></figure>",
          "blog_Quote": "<p><br/>El fruto de tu propio trabajo duro es el más dulce.</p>"
        }
      ]
    },
    "email": {
      "total": 1,
      "results": [
        {
          "email_Subject": "Fruitful Late Summer Email",
          "email_Body": "<p><br/><strong>Fruitful:&nbsp;</strong></p><p>No hay nadie que ame el dolor mismo, que lo busque y quiera tenerlo, simplemente porque es dolor.</p><figure class=\"image\"><img width=\"1100\" alt=\"Product layer 3\" src=\"https://stylelabsdemo.com/api/public/content/c8cc3c37df854f9c92c0ddef0795198d?v=0039f433\"></figure>"
        }
      ]
    }
  }
}

カーソルベースの改ページ

カーソルベースの改ページは、データセット内の特定のアイテムへのポインターを返すことによって機能します。 以降の要求では、サーバーは指定されたポインターの後に結果を返します。 カーソルベースの改ページは、オフセット改ページを使用する場合の欠点に対処しますが、これに伴う次のようなトレードオフがあります。

  • カーソルは、ソース テーブル内の一意の連続した列に基づいている必要があります。
  • クライアントは特定のページにジャンプできません。

First

first パラメータは、クエリによって返される結果の数を 2 つまでなどに制限します。返される結果は 1000 未満である必要��あります。first 引数を指定しない場合は、デフォルト値の 10 が使用されます。 クエリは 10 件の結果を返します。

query firstTwo {
  allM_Content(first:2) {
    total
    results {
      id 
      content_Name
      m_Content_IsVariant

    }
  }
}

結果は次のとおりです (結果の合計は 28 ですが、最初の 2 つの結果のみが返されます)。

{
  "data": {
    "allM_Content": {
      "total": 28,
      "results": [
        {
          "id": "BDolxU3bGkWMwFJk-s8Idg",
          "content_Name": "Fruitful Summer (es-ES)",
          "m_Content_IsVariant": true
        },
        {
          "id": "igADXjecyk2oF4lo_tfs2Q",
          "content_Name": "Fruitful Summer (es-ES)",
          "m_Content_IsVariant": true
        }
      ]
    }
  }
}

pageInfo

pageInfo フィールドには、改ページに必要な関連情報が含まれています。 null 非許容の PageInfo 型を返します。

endCursor

endCursor は、現在のクエリに対して返される最後のエッジに関連付けられたカーソルを表します。

query endCursor {
  allM_Content(first: 5) {
    total
    results {
      id
      content_Name
      m_Content_IsVariant
    }
    pageInfo {
      endCursor
      hasNext
    }
  }
}

結果は次のとおりです。

{
  "data": {
    "allM_Content": {
      "total": 28,
      "results": [
        {
          "id": "BDolxU3bGkWMwFJk-s8Idg",
          "content_Name": "Fruitful Summer (es-ES)",
          "m_Content_IsVariant": true
        },
        {
          "id": "igADXjecyk2oF4lo_tfs2Q",
          "content_Name": "Fruitful Summer (es-ES)",
          "m_Content_IsVariant": true
        },
        {
          "id": "p70lTBrPSkqTZ2Ky3BdmWw",
          "content_Name": "Fruitful Summer (es-ES)",
          "m_Content_IsVariant": true
        },
        {
          "id": "9zjJfWK_UkSoX8Gd1I8dPg",
          "content_Name": "Fruitful Summer",
          "m_Content_IsVariant": null
        },
        {
          "id": "OwuHPqtSNk25OF6CPz6s8A",
          "content_Name": "Fruitful Juices",
          "m_Content_IsVariant": null
        }
      ],
      "pageInfo": {
        "endCursor": "eyJzZWFyY2hBZnRlciI6WyIxNjEzNzMyMDk1MTcyIl0sImNvdW50Ijo1fQ==",
        "hasNext": true
      }
    }
  }
}

hasNext

hasNext は、他に利用可能な結果があるかどうかを示すブール値です。

query hasNext {
  allM_Content(first: 2) {
    total
    results {
      id
      content_Name
      m_Content_IsVariant
    }
    pageInfo {
      hasNext
    }
  }
}

結果は次のとおりです (hasNexttrue であるため、返されない結果がさらに多くあります)。

{
  "data": {
    "allM_Content": {
      "total": 28,
      "results": [
        {
          "id": "BDolxU3bGkWMwFJk-s8Idg",
          "content_Name": "Fruitful Summer (es-ES)",
          "m_Content_IsVariant": true
        },
        {
          "id": "igADXjecyk2oF4lo_tfs2Q",
          "content_Name": "Fruitful Summer (es-ES)",
          "m_Content_IsVariant": true
        }
      ],
      "pageInfo": {
        "hasNext": true
      }
    }
  }
}

After

改ページは after 引数によって行われます。 以前のクエリから endCursor の値を導き、サーバーにクエリを実行してカーソル以降の結果を検索します。

query afterEndCursor {
  allM_Content(
    first: 5
    after: "eyJzZWFyY2hBZnRlciI6WyIxNjEzNzMyMDk1MTcyIl0sImNvdW50Ijo1fQ=="
  ) {
    total
    results {
      id
      content_Name
      m_Content_IsVariant
    }
    pageInfo {
      endCursor
      hasNext
    }
  }
}

結果は次のとおりです。

{
  "data": {
    "allM_Content": {
      "total": 28,
      "results": [
        {
          "id": "wT5RNeIcQ0SHTORNT1faug",
          "content_Name": "Fruitful Summer (it-IT)",
          "m_Content_IsVariant": true
        },
        {
          "id": "Content.SalsaWithFruitChips",
          "content_Name": "Flavorful's famous salsa with Healthful fruit chips",
          "m_Content_IsVariant": null
        },
        {
          "id": "Content.PowerofProtein",
          "content_Name": "The Power of Protein",
          "m_Content_IsVariant": null
        },
        {
          "id": "Content.PowerFromWithin",
          "content_Name": "Power comes from within",
          "m_Content_IsVariant": null
        },
        {
          "id": "Content.FruitfulGinger",
          "content_Name": "Fruitful refreshing ginger lemonade",
          "m_Content_IsVariant": null
        }
      ],
      "pageInfo": {
        "endCursor": "eyJzZWFyY2hBZnRlciI6WyIxNjEzMzY0Nzg0MTk4Il0sImNvdW50IjoxMH0=",
        "hasNext": true
      }
    }
  }
}

Can we improve this article ? Provide feedback