GraphQL API
GraphQL API では、Strapi の GraphQL プラグイン 経由で コンテンツタイプ をクエリ・ミューテーションできます。結果は フィルター、ソート、ページネーション で絞り込み・並べ替え・分割取得できます。
GraphQL API を使うには、GraphQL プラグインをインストールします。
- Yarn
- NPM
yarn add @strapi/plugin-graphql
npm install @strapi/plugin-graphql
インストール後、GraphQL Playground は /graphql で開けます。クエリやミューテーションを対話的に組み立て、コンテンツタイプに合わせたスキーマドキュメントを参照できます。

GraphQL プラグインは、すべてのクエリとミューテーションを処理するエンドポイントを 1 つだけ公開します。既定は /graphql で、プラグイン設定ファイル で定義されます。
export default {
shadowCRUD: true,
endpoint: '/graphql', // <— single GraphQL endpoint
subscriptions: false,
maxLimit: -1,
apolloServer: {},
v4CompatibilityMode: process.env.STRAPI_GRAPHQL_V4_COMPATIBILITY_MODE ?? false,
};
GraphQL API ではメディアファイルのアップロードに対応していません。ファイルのアップロードは REST API の POST /upload を使い、返却情報をコンテンツから参照してください。アップロード済みメディアの更新・削除は、メディアの id を使った updateUploadFile と deleteUploadFile ミューテーションで行えます(メディアファイルのミューテーション を参照)。
documentId のみGraphQL API でドキュメントとして公開される識別子は documentId のみです。以前の数値 id はここでは使えません(後方互換のため REST API では引き続き id も返る場合があります。詳しくは 破壊的変更 を参照)。
クエリ
GraphQL のクエリは、データを変更せずに取得するために使います。
プロジェクトにコンテンツタイプを追加すると、スキーマにその単数形・複数形の API ID に対応するクエリが 2 つ自動生成されます。
| コンテンツタイプの表示名 | 単数 API ID | 複数 API ID |
|---|---|---|
| Restaurant | restaurant | restaurants |
単数 API ID と複数 API ID:
単数・複数の API ID は、Content-Type Builder でコンテンツタイプを作成するときに定義され、管理画面でコンテンツタイプを編集するときにも確認できます(ユーザーガイド を参照)。作成時にカスタム API ID を指定できますが、後から変更はできません。


単一ドキュメントの取得
は documentId で取得できます。
{
restaurant(documentId: "a1b2c3d4e5d6f7g8h9i0jkl") {
name
description
}
}
複数ドキュメントの取得
複数の は、単純なフラットクエリか、Relay 形式のクエリで取得できます。
フラットクエリは、各ドキュメントについて要求したフィールドだけを返します。Relay 形式のクエリは _connection で終わり、nodes 配列と pageInfo を返します。ページネーション用のメタ情報が必要なときは Relay 形式を使います。
- フラットクエリ
- Relay 形式のクエリ
複数件をフラットクエリで取得する例です。
{
restaurants {
documentId
title
}
}
Relay 形式では複数ドキュメントとメタ情報をまとめて取得できます。
{
restaurants_connection {
nodes {
documentId
name
}
pageInfo {
pageSize
page
pageCount
total
}
}
}
リレーションの取得
フラットクエリでも Relay 形式のクエリでも、リレーションのデータを含めて取得できます。
- フラットクエリ
- Relay 形式のクエリ
次の例では、「Restaurant」コンテンツタイプのすべてのドキュメントと、多対多リレーション先の「Category」の一部フィールドを取得します。
{
restaurants {
documentId
name
description
# categories is a many-to-many relation
categories {
documentId
name
}
}
}
Relay 形式で「Restaurant」の全ドキュメントを取得し、各レストランについて「Category」との多対多リレーションの一部フィールドも返す例です。
{
restaurants_connection {
nodes {
documentId
name
description
# categories is a many-to-many relation
categories_connection {
nodes {
documentId
name
}
}
}
pageInfo {
page
pageCount
pageSize
total
}
}
}
現状、pageInfo が有効なのは第 1 階層のドキュメントだけです。将来の Strapi ではリレーションに対する pageInfo が実装される可能性があります。
pageInfo の使い分け:
次の書き方は動作します。
{
restaurants_connection {
nodes {
documentId
name
description
# many-to-many relation
categories_connection {
nodes {
documentId
name
}
}
}
pageInfo {
page
pageCount
pageSize
total
}
}
}
次の書き方はサポートされません。
{
restaurants_connection {
nodes {
documentId
name
description
# many-to-many relation
categories_connection {
nodes {
documentId
name
}
# not supported
pageInfo {
page
pageCount
pageSize
total
}
}
}
pageInfo {
page
pageCount
pageSize
total
}
}
}}
メディアフィールドの取得
メディアフィールドも、他の属性と同様に取得します。
次の例では、「Restaurants」コンテンツタイプの各ドキュメントに付いた cover メディアの url を取得します。
{
restaurants {
images {
documentId
url
}
}
}
複数メディア用フィールドは、フラットクエリまたは Relay 形式で取得できます。
- フラットクエリ
- Relay 形式のクエリ
「Restaurant」コンテンツタイプの複数メディア images から一部属性を取得する例です。
{
restaurants {
images_connection {
nodes {
documentId
url
}
}
}
}
Relay 形式で「Restaurant」の複数メディア images から一部属性を取得する例です。
{
restaurants {
images_connection {
nodes {
documentId
url
}
}
}
}
現状、pageInfo はドキュメントに対してのみ有効です。将来、メディアの _connection に対する pageInfo が実装される可能性があります。
コンポーネントの取得
コンポーネントの内容も、他の属性と同様に取得します。
次の例では、「Restaurants」の各ドキュメントに含まれる closingPeriod コンポーネントについて、label、start_date、end_date を取得します。
{
restaurants {
closingPeriod {
label
start_date
end_date
}
}
}
ダイナミックゾーンの取得
ダイナミックゾーンは GraphQL ではユニオン型になるため、フラグメント(...on)でフィールドを指定します。コンポーネント名は ComponentCategoryComponentname 形式で、`__typename` と組み合わせて使います。
次の例では、ダイナミックゾーン dz に追加できるコンポーネントカテゴリ「Default」の「Closingperiod」について、label を取得します。
{
restaurants {
dz {
__typename
...on ComponentDefaultClosingperiod {
# define which attributes to return for the component
label
}
}
}
}
下書き版・公開版の取得
コンテンツタイプで 下書きと公開 が有効な場合、クエリに status を付けて の下書きまたは公開版を取得できます。
query Query($status: PublicationStatus) {
restaurants(status: DRAFT) {
documentId
name
publishedAt # should return null
}
}
query Query($status: PublicationStatus) {
restaurants(status: PUBLISHED) {
documentId
name
publishedAt
}
}
集計
集計は、すべてのドキュメントを取得せずに件数・合計・グループ集計などを求めるために使います。集計は Relay 形式のコネクションクエリ経由で公開されます。コレクション型ごとに <複数形>_connection クエリの下に aggregate フィールドがあります。
{
restaurants_connection(filters: { categories: { documentId: { eq: "food-trucks" } } }) {
aggregate {
count
}
}
}
集計は親クエリと同じフィルター、ロケール、公開状態、権限の制約を受け ます。例えばコネクションに locale: "fr" や status: DRAFT を付けると、その条件に合うドキュメントだけが集計対象になり、ユーザーが読み取り可能なコンテンツだけが集計されます。
利用できる集計演算子は次のとおりです。
| 演算子 | 説明 | 対応するフィールド型 |
|---|---|---|
count | クエリに一致するドキュメント数。 | すべてのコンテンツタイプ |
avg | 数値フィールドの算術平均。 | Number, integer, decimal |
sum | 数値フィールドの合計。 | Number, integer, decimal |
min | フィールドごとの最小値。 | Number, integer, decimal, date, datetime |
max | フィールドごとの最大値。 | Number, integer, decimal, date, datetime |
groupBy | 値ごとにバケット化し、各バケットでネストした集計が可能。 | スカラー(string, number, boolean, date, datetime)、リレーション |
avg、sum、min、max では Strapi は null を無視します。リレーションを集計するときも、対象ドキュメントのロケールと権限は尊重されます。
集計はサーバー側で行われるため、大 量データをクライアントに落として処理するより一般的に速いです。ただし groupBy の木が深い、または投影が広いと負荷は高くなります。フィルターで対象を絞り、depthLimit や amountLimit を設定することを検討してください(利用可能なオプション)。You are not allowed to perform this action などは、対象コレクションの Read 権限がない場合に起きがちです。
1 リクエストで複数指標を集計
複数の集計を組み合わせ、1 往復で複数の指標を返せます。
{
restaurants_connection(filters: { takeAway: { eq: true } }) {
aggregate {
avg {
delivery_time
}
min {
price_range
}
max {
price_range
}
}
}
}
グループ化
groupBy でグループごとの指標を求め、各グループ内でさらに集計を連鎖できます。各グループには一意の key と、ドリルダウンや件数カウントに使えるネストした connection があります。
{
restaurants_connection {
aggregate {
groupBy {
categories {
key
connection {
aggregate {
count
}
}
}
}
}
}
}
グループはトップレベルのフィルターを引き継ぎます。特定のグループだけをさらに絞るには、ネストした connection にフィルターを指定します。