Shopify Laravel GraphQLで高速取得

Shopify Laravel GraphQLで高速取得

Shopify+LaravelでGraphQL APIを活用する

ShopifyはREST APIだけでなくGraphQL APIを提供しており、Laravelとの組み合わせで高速かつ柔軟なデータ取得が可能です。GraphQL APIは必要なフィールドだけをリクエストできるため、ネットワーク帯域を節約し、レスポンス時間を短縮します。LaravelではHTTPクライアントを使って簡単にGraphQLエンドポイントへリクエストを送ることができ、認証にはShopifyのアクセストークンを利用します。

GraphqlQueryとMutationの実装例

GraphqlQueryは読み取り専用のクエリ、Mutationはデータ変更を行う操作です。Laravelのサービスクラスで以下のように実装します。

public function getProducts()
{
    $query = <<<'GRAPHQL'
{
  products(first: 10) {
    edges {
      node {
        id
        title
        variants(first: 5) {
          edges { node { id price } }
        }
      }
    }
  }
}
GRAPHQL;
    return $this->client->post('/admin/api/2026-01/graphql.json', [
        'json' => ['query' => $query]
    ]);
}

Mutationの例として、商品を作成するリクエストは次のようになります。

public function createProduct($title, $price)
{
    $mutation = <<<'GRAPHQL'
mutation ($input: ProductInput!) {
  productCreate(input: $input) {
    product { id title }
    userErrors { field message }
  }
}
GRAPHQL;
    $variables = ['input' => ['title' => $title, 'variants' => [['price' => $price]]]];
    return $this->client->post('/admin/api/2026-01/graphql.json', [
        'json' => ['query' => $mutation, 'variables' => $variables]
    ]);
}

データ取得とクエリ作成のベストプラクティス

GraphqlQueryを作成する際は、必要なフィールドだけを指定し、不要なデータを排除します。これにより、API制限に引っかかりにくく、レスポンスサイズを小さく保てます。また、Laravelのキャッシュ機能を利用して頻繁にアクセスされるデータをローカルに保存し、API呼び出し回数を削減することも重要です。

エラーハンドリングとページネーション

GraphQL APIはレスポンスにerrorsフィールドを含む場合があります。Laravel側で例外を捕捉し、ユーザーに分かりやすいメッセージを返すようにします。ページネーションはedgespageInfoを利用し、hasNextPageendCursorで次ページの取得を制御します。

if ($response['data']['products']['pageInfo']['hasNextPage']) {
    $cursor = $response['data']['products']['pageInfo']['endCursor'];
    // 次ページを取得
}

カーソルと効率的な取得、API制限への対策

カーソルベースのページネーションは、インデックスベースよりも安定したデータ取得を可能にします。Shopifyは1分あたりのリクエスト数に制限があるため、カーソルを使って必要なデータだけを順次取得し、リクエスト数を最小化します。さらに、batch機能を活用して複数のクエリを1回のリクエストで送ることで、API制限を超えにくくなります。

この記事はAIによって作成されました。

コメント

このブログの人気の投稿

Blogger Sitemap登録エラー解決

【iOS】SwiftでCGAffineTransformから角度・ラジアン・度数・スケールを計算する方法

Ollama & Open WebUI: ローカルLLM構築