とりあえずはサンプルで入れてあるデータを GraphQL でどうやって取り出すのかを試してみる。
先日のエントリの Altair GraphQL Client を使ってみる。
ちゃんとドキュメントを読みましょう、という話ではあるのだけど試行錯誤で。。。
ざっくりコードの全体
コードとしてはざっくりこんな感じ。
query { news: entries(section: "news",status: "live") { title slug ...on news_news_Entry{ c_richeditor testmatrix{ ...on testmatrix_testmatrix_BlockType{ testmatrix } } } ...on news_newslink_Entry{ c_text1 } ...on news_newsasset_Entry{ c_asset{ id url } } } product: entries(section: "product",status: "live") { title slug ...on product_product_Entry{ c_textarea01 c_text1 sample_product_select_genre{ id title } sample_product_select_maker{ id title } c_asset{ id url } } } }
セクションとしてニュースのセクションと製品のセクションのデータを取り出す。
Query
query { news: entries(section: "news",status: "live") { 〜〜〜 } product: entries(section: "product",status: "live") { 〜〜〜 } }
Response
{ "data": { "news": [ { "title": "お知らせテスト", "slug": "test-20190810", "c_richeditor": "<p>c_richeditor field</p>", "testmatrix": [ { "testmatrix": "<p>testmatrix block field aaa</p>" } ] } ], "product": [ { "title": "製品5_20191002-1030", "slug": "製品5", "c_textarea01": "製品5製品5製品5製品5製品5製品5製品5製品5製品5製品5\n製品5製品5製品5製品5製品5\n製品5製品5", "c_text1": "5555555555", "sample_product_select_genre": [ { "id": "649", "title": "フロントエンド" } ], "sample_product_select_maker": [ { "id": "674", "title": "ハムワークス" } ], "c_asset": [ { "id": "67", "url": "https://bp1-test.craft-demo.mixh.jp/asset/RED19526E005_TP_V.jpg" } ] }, ] }
タイトルやslugは直接取れるが、その他フィールドは入力タイプの中にあるという感じっぽいので、
news: entries(section: "news",status: "live") { title slug ...on news_news_Entry{ c_richeditor testmatrix{ ...on testmatrix_testmatrix_BlockType{ testmatrix } } }
こんなかんじで
...on <$section handle$>_<$entrytype handle$>_Entry{ 〜〜 }
の中で取り出す。
Matrix フィールドの取り出し
Matrixの場合はさらに
<$matrixfield handle$>{ ...on <$field handle$>_<$block handle$>_BlockType{ <$field handle$> } }
のような感じで取り出す。
こんな感じで取り出すなら SuperTable もいけるのかなー、と思ったけどうまくとれず。
リレーション系のフィールドの取り出し
リレーション系のフィールドは普通のフィールドと同様に取り出しつつ、設定されているオブジェクトの情報があるので、id, title とかフィールドの値を取り出せる
product: entries(section: "product",status: "live") { title ...on product_product_Entry{ c_textarea01 sample_product_select_genre{ id title }
sample_product_select_genre
がこの場合はリレーションのフィールド。
この辺のメッセージが出るけど、これは特に気にしなくても大丈夫だった。