ðž GraphQLã¯WordPressãã©ã®ããã«ãã©ãã§æ¹åã§ãããââREST APIãè£å®ãã圢ã§
æŽæ° 2024幎1æ5æ¥: Gato GraphQL vs WP REST API ã®æ¯èŒãã芧ãã ããã
å 鱿«ãããã°èšäº ðŠžð¿ââïž Gato GraphQL 㯠PHP 8.0 ãã 7.1 ãžã®ãã©ã³ã¹ãã€ã«ã«å¯Ÿå¿ããŸãã ãå ¬éããŸããã
Reddit ã® /r/php ã§ãã®èšäºãå ±æãããšãããã³ãã¥ããã£ã§ã¯ WordPress ã§ GraphQL ã䜿ãããšã®äŸ¡å€ãWP REST API ãšã®éãããããŠãŸãå¥ã® API ã WordPress ã«æã¡èŸŒãå¿ èŠæ§ã«ã€ããŠã掻çºãªè°è«ãèµ·ããŸããã
ã»ãšãã©ã®ã³ã¡ã³ãã¯çãå°ãŠãããšæããŸãããããã€ãã¯éèŠãªæ å ±ãæããŠããŸããGraphQL ã¯åãªãã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯ãªããå®è£ ã§ããããŸããã€ãŸããç°ãªããããã€ããŒã®ç°ãªã GraphQL ãµãŒããŒã¯ãããããç°ãªãç¹æ§ãåªå ããŠèšèšãããŠããå¯èœæ§ããããŸãããã®ãããGraphQL ãæäŸãããã®ããGraphQL ãšã³ãžã³ãã©ã®ããã«åäœãããã«ã€ããŠãåžžã«çµ±äžããæåŸ ãæã€ããšããå®å šã«çè§£ããããšãé£ããã®ã§ãã
ããšãã°ãWordPress ãš Laravel ã§ã® GraphQL ã®äœéšã¯ç°ãªããŸãããç°ãªããµãŒããŒïŒWPGraphQL ãš Gato GraphQLïŒãæäŸããäœéšãç°ãªããŸãã
ãã®èšäºã¯ãReddit ã®æçš¿ã«å¯ããããããã€ãã®ã³ã¡ã³ãã«å¯Ÿãããç§èªèº«ã®èŠè§£ã§ãã
GraphQL vs WP REST API
[ãšãã§ããªãèãã ] ãã§ã«ç¬èªã® REST API ã䜿ã£ãŠãã WordPress ã®äžã« GraphQL API ãèŒãããªããŠãREST API ããã®ãŸãŸäœ¿ãã°ããã [åºå ž]
REST API ãš GraphQL ã¯ã©ã¡ããåãç®çãæãããŸããããªãã¡ãã¢ããªã±ãŒã·ã§ã³ãå¿ èŠãšããããŒã¿ãæäŸããããšã§ãããã ãããã®éææ¹æ³ãç°ãªããŸããREST ã¯ç¹å®ã®ããŒã¿ã»ãããæäŸããå®çŸ©æžã¿ã®ãšã³ããã€ã³ããæã€ã®ã«å¯ŸããGraphQL ã¯å¿ èŠãªããŒã¿ã ããæ£ç¢ºã«æäŸã§ããŸãã
ãã®åäœã®éãã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«çŽæ¥åœ±é¿ãäžããããšããããŸããREST ã§ã¯ãæçš¿ã®äžèЧãšåæçš¿ã®èè ããŒã¿ãååŸããå¿ èŠãããå Žåã远å ã®ãªã¯ãšã¹ããéãå¿ èŠããããŸãããã¹ãŠã®èè ããŒã¿ã«å¯Ÿã㊠1 ä»¶ã®è¿œå ãªã¯ãšã¹ãããããã¯èè ããšã« 1 ä»¶ã®è¿œå ãªã¯ãšã¹ããå¿ èŠã«ãªãå¯èœæ§ããããŸãããã®éããŠã§ããµã€ãã®èšªåè ã¯ããŒãžã®ã¬ã³ããªã³ã°ãåŸ ã£ãŠããç¶æ ã«ãªããŸãã
GraphQL ã¯ãã®ç¶æ³ãæ¹åããŸããæçš¿ãšèè ã®ãã¹ãŠã®ããŒã¿ã 1 åã®ãªã¯ãšã¹ãã§çŽæ¥ååŸã§ãããŠã§ãããŒãžã®ã¬ã³ããªã³ã°ãéããªããŸãã
{
posts {
id
title
excerpt
date
url
author {
id
name
url
}
}
}WordPress ã«ãã§ã« REST API ããããããšãã£ãŠãããããã¹ãŠã®ã¿ã¹ã¯ã«å¯ŸããŠåžžã«æé©ãªããŒã«ã§ãããšã¯éããŸããããã¡ããåžžã«äœ¿ãããšã¯ã§ããŸãããGraphQL ã«ãã¢ã¯ã»ã¹ã§ããå Žåã¯ãREST ããæå©ãªå Žé¢ã§ã¯ãã® API ã䜿ãããšãéžã¹ãŸããããã®æ¹ãè¯ãçµæã«ã€ãªãããŸãã
GraphQL ã®åæèšå®ã®é£ãã + ãªãŸã«ããŒã®èšè¿°
GraphQL ã®åæèšå®ã¯ REST ã«æ¯ã¹ãŠææ°é¢æ°çã«é«ããšããè°è«ã¯ç¢ºãã«ãããŸããé¢é£ä»ããèšå®ããªããã°ãªããªããšããç¹ã¯ãã®éãã§ãã [åºå ž]
ãããŠ...
ããªãããŠã§ãäžã®ã»ãŒãã¹ãŠã®äººãèŠèœãšããŠããã®ã¯ããã® API 圢åŒãæ©èœãããããã«ã¯ããŒãµãŒïŒãªãŸã«ã㌠+ åïŒãæžããªããã°ãªãããããã REST ã§ã¯ååšããªãäžé£ã®åé¡ãåŒãèµ·ãããšããç¹ã§ãã [åºå ž]
ãããã®ã³ã¡ã³ãã¯å®å šã«æ£ç¢ºã§ã¯ãããŸããããªããªããWPGraphQL ãš Gato GraphQL ã¯ãã§ã« WordPress ã®ããŒã¿ã¢ãã«ã GraphQL ã¹ããŒãã«ãããã³ã°ããŠããããã§ãïŒWPGraphQL ã¯å®å šã«ãç§ã®ãã©ã°ã€ã³ã¯ã»ãšãã©å¯Ÿå¿æžã¿ã§ãïŒã
ã€ãŸãããããã®ãã©ã°ã€ã³ã®ãããããã€ã³ã¹ããŒã«ããã°ããªãŸã«ããŒãäœæãããããšã³ãã£ãã£éã®é¢é£ä»ããèšå®ãããããå¿ èŠãªããããã«ã¢ããªã±ãŒã·ã§ã³ã®ããŒã¿ååŸãéå§ã§ããŸãã
確ãã«ãã¢ããªã±ãŒã·ã§ã³åºæã®ãšã³ãã£ãã£ïŒCPT ãªã©ïŒããã«ã¹ã¿ã ããŒã¿ãååŸããã«ã¯ããªãŸã«ããŒã䜿ã£ãŠãããã³ã°ããå¿ èŠããããããã¯èªåã§è¡ãå¿ èŠããããŸãããã ãããã㯠REST ãšå€ãããŸãããCPT ããã«ã¹ã¿ã ããŒã¿ãå¿ èŠãªãããã®ã«ã¹ã¿ã ããŒã¿ãååŸããããã® REST ãšã³ããã€ã³ããäœæããå¿ èŠããããŸããã«ã¹ã¿ã ãšã³ããã€ã³ãããªãŸã«ããŒã®äžçš®ã§ãã
ãããã£ãŠããªãŸã«ããŒã®å¿ èŠæ§ãšãã芳ç¹ã§ã¯ãREST ãš GraphQL API ã¯ã»ãŒåãã§ãã
ãŠã§ããµã€ããããã¥ã¡ã³ããèŠããšãGraphQL ã®æ¹ãã»ããã¢ããã«æéããããå°è±¡ãåããŸãããã®æã蟌ã¿ã«ã¯äžå®ã®æ ¹æ ããããŸãã
ããã€ãã®çç±ãèããããŸãããŸããGraphQL ã«ã¯ïŒå°ãªããšãïŒ2 ã€ã®åŽé¢ããããŸãã
- ãããäœã§ããããã©ã®ããã«æ©èœããããšããæŠå¿µ
- å®éã®å®è£ ãæäŸãããµãŒããŒ
graphql.org ã®ãã㪠GraphQL ã®å ¬åŒãµã€ãã®ããã¥ã¡ã³ããèŠããšãGraphQL ã®èåŸã«ããæŠå¿µã«çŠç¹ãåœãŠãŠããããªãŸã«ããŒãšã¯äœãããªãå¿ èŠãªã®ãã«ã€ããŠè©³ãã説æããŠããŸãã
ããã¯ãLaravel ãš Lighthouse ã䜿ãå Žåã®ããã«ããŒãããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããéã«ã¯åœ¹ç«ã¡ãŸãããã®å ŽåããªãŸã«ããŒãèªåã§ã³ãŒãã£ã³ã°ããå¿ èŠããããŸãïŒãã ããREST ãšã³ããã€ã³ããèªåã§äœæããå¿ èŠããããŸãïŒã
ããããWordPress ã¯ãã§ã«ã¢ããªã±ãŒã·ã§ã³ã§ãããWPGraphQL ãš Gato GraphQL ã¯ãã®ãœãªã¥ãŒã·ã§ã³ã§ãããã® 2 ã€ã®ãã©ã°ã€ã³ã¯ãã§ã«ãªãŸã«ããŒãäœææžã¿ãªã®ã§ãç§ãã¡ãæ°ã«ããå¿ èŠã¯ãããŸããïŒWP REST API ãåæãšã³ããã€ã³ãã®ã»ãããæäŸããŠãããæ°ã«ããå¿ èŠããªãã®ãšåæ§ã§ãïŒã
ããã«ãGraphQL ã¯éçºè åãã§ããããã®ããã¥ã¡ã³ãã¯éçºè ã«çŽæ¥èªããããŠããããã«èŠããŸããéçºè ããµãŒããŒåŽã§ãªãŸã«ããŒãäœæããã¯ã©ã€ã¢ã³ãåŽã§ã¯ã«ã¹ã¿ã ã¯ãšãªã§ãããã®ãªãŸã«ããŒã䜿çšããŸãããªãŸã«ããŒã®æ§ç¯ã¯éçºè ã®ä»äºã§ãããããèªç¶ã«é »ç¹ã«ç»å ŽããŸãã
REST ã«ã€ããŠã¯ãå¿ èŠãªããŒã¿ãæäŸãããšã³ããã€ã³ãã¯ãã§ã«ååšããŠããã¯ãïŒWP REST API ãæäŸãããã®ïŒãšããæåŸ ããããŸãïŒãšç§ã¯èããŸãïŒãååšããªãå Žåã«åããŠãã«ã¹ã¿ã ãšã³ããã€ã³ãã®ã»ããã¢ãããèããå¿ èŠããããŸãããã®ãããREST ã§ã¯ãªãŸã«ããŒã®äœæãžã®èšåãå°ãªããªããŸãã
ã€ãŸããREST ãš GraphQL ã¯ã©ã¡ããå¿ èŠãªããŒã¿ãæäŸããŸãããã ããREST ã¯ãšã³ããã€ã³ãããã§ã«ååšããŠããã¹ããšããéçãªã¢ãããŒããä¿ããååšããªãå Žåã«ã®ã¿æ°ã«ããŸããäžæ¹ãGraphQL ã¯ãã¹ãŠã®ã¯ãšãªãã«ã¹ã¿ã ã¡ã€ãã«ããåçãªã¢ãããŒããä¿ãããã®å®ç§ãªãªãŸã«ããŒãã³ãŒãã£ã³ã°ã§ããŸãã
æçµçã«ã¯ãREST ãš GraphQL ã®éã«æ ¹æ¬çãªéãã¯ãªããèŠä»¶ãã©ã®ããã«æºããã¹ãããšããè§£éã®éãã ãããããŸãã
GraphQL ã®èåŒ±æ§ + ã»ãã¥ãªãã£äžã®èæ ®äºé
ã»ãã¥ã¢ãªã€ã³ã¿ãŒããªã¿ãŒãæžãããšã¯æ¬åœã«é£ããã®ã§ããã€ã GraphQL ãã倧ããªè匱æ§ãçãŸããã§ãããã [åºå ž]
ãããŠ...
WordPress ã¯ãã§ã«å·šå€§ãªã®ã§ãåžžã«å€§ããªã¿ãŒã²ããã«ãªã£ãŠããŸãããã©ã°ã€ã³ã远å ããã ãã§ãªã¹ã¯ãå€§å¹ ã«å¢å ããŸãããããŠãWordPress ã®ãã¹ãŠãæåéãå ¬éããããšãããã©ã°ã€ã³ïŒã¡ãã¥ãŒãšã¡ãã¥ãŒã¢ã€ãã ãå ¬éããããã¹ãŠã®ãŠãŒã¶ãŒãå ¬éãããªã©ã®ã»ãã¥ãªãã£ã¢ãã«ãåé¿ãããµã³ãã«ã³ãŒããå«ãïŒã¯ãç§ã«ã¯çµ¶å¯Ÿã«åãå ¥ããããŸãããããŒã以å€ã®åºåã¯ã絶察ã«å¿ èŠãªãã®ãè¶ ããŠãã§ããéãå¶éãããã¹ãã§ãïŒç§ãèŠæ±ããªãéãååšããªãã¹ãã§ãïŒããããã³ã¢ã«å ¥ãããšããªãããšãé¡ããŸãã [åºå ž]
GraphQL ã¯ç¢ºãã«è¿œå ã®ã»ãã¥ãªãã£ãªã¹ã¯ãããããã察åŠãå¿ èŠã§ãããã®æžå¿µã«ã¯å®å šã«åæããŸãã
ãã ããããã GraphQL ã WP ã³ã¢ã«å«ããå¯èœæ§ãé»ã決å®çãªåé¡ã ãšã¯æããŸãããããã«ã察åŠãæ¬åœã«é£ãããšãæã£ãŠããŸããã
å¿ èŠãªã®ã¯ãGraphQL ãµãŒããŒã WordPress ã®æ¢åã®ã»ãã¥ãªãã£ã¡ã«ããºã ãæŽ»çšããéçºè ããã®ã¡ã«ããºã ã䜿çšããŠãç¹å®ã®ãã£ãŒã«ãã«é©åãªãŠãŒã¶ãŒã®ã¿ãã¢ã¯ã»ã¹ã§ããããã«ããããšã§ãã
- ãŠãŒã¶ãŒã¯ãã°ã€ã³ããŠãããïŒ
- ãŠãŒã¶ãŒã¯ç®¡çè ãïŒ
- ãŠãŒã¶ãŒã¯äœããã®ããŒã«ãæš©éãæã£ãŠãããïŒ
- ãŠãŒã¶ãŒã¯ãã®æçš¿ã®èè ãïŒ
ãã®èŠä»¶ãæºããããã«ãGato GraphQL ã§ã¯ Access Control ListsïŒã¢ã¯ã»ã¹å¶åŸ¡ãªã¹ãïŒ ãæäŸããŠãããåãã£ãŒã«ããšãã£ã¬ã¯ãã£ãã«ã¢ã¯ã»ã¹ã§ãã人ãèšå®ã§å®çŸ©ã§ããŸãã
ãã ããACL ã ãã§ã¯äžååãªå ŽåããããGraphQL ãµãŒããŒã远å ã®ã»ãã¥ãªãã£å¯ŸçãæäŸããå¿ èŠããããŸããçŸåš Gato GraphQL ã®æ¬¡æ v0.8 ã«åããŠåãçµãã§ããããšãã玹ä»ããŸãã
ãã£ãŒã«ã postsïŒæçš¿ããŒã¿ãååŸãããã®ïŒã¯èªèšŒãå¿
èŠãšããããã°ã€ã³äžãã©ããã«é¢ãããã©ã®ãŠãŒã¶ãŒã§ãã¢ã¯ã»ã¹ã§ããŸãããã®ãããã»ãã¥ãªãã£äžã®çç±ãããå
¬éæžã¿ã®æçš¿ã®ã¿ãååŸããŸãã
ãã ãã以äžã®ãããªç¶æ³ã§ã¯äžæžãã»ä¿çäžã»ãŽãç®±ã®æçš¿ãååŸããå¿ èŠããããŸãã
- 管çè ãå®è¡ããéçãŠã§ããµã€ãã®æ§ç¯ïŒãµã€ãã®ãã¹ãŠã®ããŒã¿ãžã®ã¢ã¯ã»ã¹ããïŒ
- æçš¿ã®èè ããç·šéãç¶ããããããã«äžæžãæçš¿ã®äžèЧã衚瀺ããå Žå
ããã§ã次ã®ã¹ããŒã ãèããŸãããæçš¿ãååŸããããã« 3 ã€ã®ãã£ãŒã«ããçšæãããŸãã
posts: 誰ã§ãã¢ã¯ã»ã¹å¯èœã§ãå ¬éæžã¿ã®æçš¿ã®ã¿ååŸã§ããmyPosts: 誰ã§ãã¢ã¯ã»ã¹å¯èœã§ããã°ã€ã³äžã®ãŠãŒã¶ãŒã®æçš¿ã®ã¿ãä»»æã®ã¹ããŒã¿ã¹ïŒå ¬éæžã¿ã»äžæžãã»ä¿çäžã»ãŽãç®±ïŒã§ååŸããpostsForAdmin: 管çè ã®ã¿ã¢ã¯ã»ã¹å¯èœã§ãä»»æã®ã¹ããŒã¿ã¹ã®ãã¹ãŠã®æçš¿ãååŸãã
ãããŠãpostsForAdmin ã¯ããã©ã«ãã§ç¡å¹ã«ãªã£ãŠãããããGraphQL ã¹ããŒãã«è¡šç€ºãããŸããã管çè
ãæç€ºçã«æå¹ã«ããå Žåã®ã¿è¡šç€ºãããŸãïŒããããéçãµã€ãã®æ§ç¯ã«ã®ã¿æå¹åãããã§ãããïŒã
å¥ã®ç¶æ³ãšããŠããããã£ãŒã«ããå
¬éããŒã¿ãšãã©ã€ããŒãããŒã¿ã®äž¡æ¹ãååŸã§ããå ŽåããããŸããããšãã°ããã£ãŒã«ã option ã¯ããŒãã« wp_options ããããŒã¿ãååŸããŸããäžéšã®ãšã³ããªã¯å
¬éïŒblogname ãªã©ïŒã§ãããããã§ãªããã®ïŒadmin_email ãªã©ïŒããããŸãã
åæ§ã®ç¶æ³ãšããŠããã£ãŒã«ã Post.metaValueãUser.metaValue ãªã©ãéããŠã¡ã¿å€ãååŸããå ŽåããããŸããããšãã°ããŠãŒã¶ãŒã¡ã¿ã«ã¯ééããªããã©ã€ããŒããªãšã³ã㪠wp_capabilities ãå«ãŸããŸãããdescription ã¯å
¬éãããŠããŸãããã㊠last_name ã¯ãã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠå
¬éãŸãã¯ãã©ã€ããŒãã®ã©ã¡ãã«ããªãããŸãã
ãã®ããŒã¿ãžã®ã¢ã¯ã»ã¹ãå®å šã«ããããããã©ã°ã€ã³ã§ã¯èšå®ããŒãžã®èš±å¯/æåŠãªã¹ãã«ãããã¯ãšãªå¯èœãªãšã³ããªãæå®ã§ããããã«ãªããŸãããšã³ããªå šäœãŸãã¯æ£èŠè¡šçŸã®äž¡æ¹ãåãä»ããŸãã

èš±å¯ããããªãã·ã§ã³ã®ã¯ãšãªã¯æ©èœããæåŠããããªãã·ã§ã³ã¯ null ãè¿ããŸãã
{
# This option is allowed
siteName: optionValue(name: "blogname")
# This optionValue is not allowed
adminEmail: optionValue(name: "admin_email")
}GraphQL ãµãŒããŒã«ããé©åãªã»ãã¥ãªãã£å¯Ÿçãšãéçºè ã®åžžèãããã°ãã»ãã¥ã¢ãª GraphQL API ã®æ§ç¯ã¯é£ãããªãã¯ãã§ãã
GraphQL ã«ããããŒã¿ããŒã¹ã®ããŠã³
GraphQL ã¯æ·±ããªã¬ãŒã·ã§ãã«ã¯ãšãªã衚çŸã§ãããªãããªæ§æãæã£ãŠããŸããWordPress ã®ãããªãšã³ã·ã¹ãã ã§ã¯ãããŒã¿ã¢ãã«ã®æ¡åŒµæ§ã ãšã³ãã£ãã£å±æ§å€ãã¿ãŒã³ ã«åºã¥ããŠãããããGraphQL ã¯ãšãªãæ·±ããè€éããŸãã¯ååž°çãªå ŽåãããŒã¿ããŒã¹ã«ä¿¡ããããªãã»ã©ã®è² è·ããããããµã€ããå¿çããªããªãå¯èœæ§ããããŸããWordPress ã¯ãã§ã« MySQL/MariaDB ã€ã³ã¹ã¿ã³ã¹ãéçãŸã§è¿œã蟌ãããšã§æåã§ããã¯ãšãªãé©åã«èšè¿°ã»èªèšŒã»ã¬ãŒãå¶éãããŠããªããã°ãGraphQL ã远å ããããšã§ããã«æªåããå¯èœæ§ããããŸãã [åºå ž]
ããŒã¿ããŒã¹ã®ããŠã³ã¯ãGraphQL ãµãŒããŒã«ãšã£ãŠæ·±å»ãªæžå¿µäºé ã§ããGato GraphQL ããã®ã·ããªãªãåé¿ããããšããŠããæ¹æ³ãã説æããŸãã
Gato GraphQL ã¯ãã¢ãŒããã¯ãã£èšèšã«ãã£ãŠ N+1 åé¡ãçºçããªãããã«ããŠããŸãããšã³ãžã³ãããŒã¿ããŒã¹ãããšã³ãã£ãã£ãèªã¿èŸŒã責任ãæã¡ãéçºè ã§ã¯ãããŸããã
ãªãŸã«ããŒã§æ¥ç¶ã解決ããéãè¿ãããå€ã¯ãªããžã§ã¯ãèªäœã§ã¯ãªãããªããžã§ã¯ãã® IDïŒãŸã㯠ID ã®ãªã¹ãïŒã§ããããšãã°ãã«ã¹ã¿ã æçš¿ã®èè ãååŸããã®ã¯æ¬¡ã®ããã«è¡ããŸãã
class CustomPostFieldResolver extends AbstractDBDataFieldResolver
{
private CustomPostUserTypeAPIInterface $customPostUserTypeAPI;
public function getClassesToAttachTo(): array
{
return [
CustomPostFieldInterfaceResolver::class,
];
}
public function getSchemaFieldType(string $fieldName): ?string
{
return match($fieldName) {
'author' => SchemaDefinition::TYPE_ID,
default => null,
};
}
public function resolveValue(
TypeResolverInterface $typeResolver,
object $customPost,
string $fieldName,
array $fieldArgs = []
): mixed {
switch ($fieldName) {
case 'author':
return $this->customPostUserTypeAPI->getAuthorID($customPost);
}
return null;
}
public function resolveFieldTypeResolverClass(
TypeResolverInterface $typeResolver,
string $fieldName
): ?string {
switch ($fieldName) {
case 'author':
return UserTypeResolver::class;
}
return null;
}
}resolveValue ãã DB ãšã³ãã£ãã£ã® ID ããresolveFieldTypeResolverClassïŒã¯ã©ã¹ UserTypeResolver ã§è¡šãããïŒãããªããžã§ã¯ãã®åãååŸããããšã§ãGraphQL ãšã³ãžã³ã¯ãªããžã§ã¯ãã®ããŒã¿ãèªã¿èŸŒããŸãã
ããŒã¿ã®èªã¿èŸŒã¿ã«ããšã³ãžã³ã¯éåžžã«å¹ççãªã¢ã«ãŽãªãºã ã䜿çšããŠããŸããããã¯ããŒãã®æ°ã§ã¯ãªããã¯ãšãªå
ã®åã®æ°ã n ãšããæéèšç®é O(n) ã§ãã
ãã®ã¢ã«ãŽãªãºã ããã®å¹çãéæã§ããã®ã¯ãã°ã©ãããã©ããŒã¹ããã®ã§ã¯ãªããããŒã¿æ§é ãã³ã³ããŒãã³ãã®ã¹ã¿ãã¯ã«å€æããããã§ããããã¯è§£æ±ºãã¯ããã«ç°¡åã§ããïŒGraphQL ã®ãã°ã©ããã¯æŠå¿µã§ãããå®éã®å®è£ ã§ã¯ãããŸãããïŒ
ã¯ãšãªãè€æ°ã®ã¬ãã«ãæã¡ãããããå€ãã®ãšã³ãã£ãã£ãååŸããå Žåã§ããã¢ã«ãŽãªãºã ã¯ããªãããèããããšãã§ããŸããããšãã°ãæ·±ã 10 ã¬ãã«ã®æ¬¡ã®ã¯ãšãªãå®è¡ããŠãã倧ããªåœ±é¿ã¯ãããŸããã
{
posts(pagination: { limit: 10 }) {
excerpt
title
url
author {
name
url
posts(pagination: { limit: 10 }) {
title
tags(pagination: { limit: 10 }) {
slug
url
posts(pagination: { limit: 10 }) {
title
comments(pagination: { limit: 10 }) {
content
date
author {
name
posts(pagination: { limit: 10 }) {
title
url
comments(pagination: { limit: 10 }) {
content
date
author {
name
username
url
}
}
}
}
}
}
}
}
}
}
}ãã®å¹çã®äŸå€ã¯ãPost.metaValueãUser.metaValueãComment.metaValueãPostTag.metaValueãPostCategory.metaValueïŒããã³ metaValues ãã£ãŒã«ãïŒãéããŠã¡ã¿å€ãååŸããå Žåã§ããWordPress ã®é¢æ°ïŒget_post_metaãget_user_meta ãªã©ïŒã¯ 1 床㫠1 ã€ã® ID ã®ããŒã¿ãååŸãããããåãšã³ãã£ãã£ã¯ã¡ã¿å€ãååŸããããã«ããŒã¿ããŒã¹ãžã®åŒã³åºããå¿
èŠãšããŸãããã®çµæãã¡ã¿å€ã®è§£æ±ºã¯åã®æ°ã§ã¯ãªãããŒãã®æ°ã«å¿ããŠã¹ã±ãŒã«ããŸãïŒãã®ç¹ã«ã€ããŠã¯ãå
ã®ã³ã¡ã³ããçãå°ãŠããŸãïŒã
æªæã®ããè¡çºè ãã¡ã¿ãã£ãŒã«ãã䜿çšã»æªçšããããšãé²ãããã«ãGato GraphQLïŒv0.8ïŒã§ã¯ãããã®ãã£ãŒã«ããããã©ã«ãã§ç¡å¹ã«ããŠåºè·ããŸãã管çè ãæç€ºçã«æå¹ã«ããå¿ èŠãããããã®éã«ãããã®ãã£ãŒã«ãã Access Control List ã«çœ®ãããšã§ãDB ãæ»æãªã¹ã¯ã«ãããããããšã¯ãããŸããã
ã¬ãŒãå¶éãåªããã¢ã€ãã¢ã§ãããå°æ¥ã®ãªãªãŒã¹ã§ãµããŒãããäºå®ã§ãã
ãããŠãã¯ãšãªã®è€éãã®åæãšå¶éã®é©çšïŒäœã¬ãã«ã®æ·±ããŸã§èš±å¯ããããªã©ïŒã«ã€ããŠãæ€èšããŠããŸããGraphQL ãµãŒããŒã¯æéèšç®é O(n) ã§ã¯ãšãªã解決ãããããã«ãŒãã«é¢ããŠã¯ããã»ã©å€§ããªå®³ã¯ãããŸããããã ãã1 ã€ã®ã¯ãšãªã ãã§ã DB ããç¡å¶éã®éã®ããŒã¿ãååŸã§ããå¯èœæ§ããããããã¯åé¿ããããã®ã§ãã
ããšãã°ã次ã®ã·ã³ãã«ãªã¯ãšãªã¯ 1 åã®ãªã¯ãšã¹ãã§å€§éã®ããŒã¿ãååŸããŸãïŒç§ã®ãã¢ãµã€ãã«ã¯ã»ãã®æ°çŸä»¶ã®ã¬ã³ãŒããããªããããå®è¡ã宿Œããäœè£ããããŸãïŒã
{
posts000: posts(pagination: { limit: 100 }) {
...PostFields
}
posts100: posts(pagination: { limit: 100, offset: 100 }) {
...PostFields
}
posts200: posts(pagination: { limit: 100, offset: 200 }) {
...PostFields
}
posts300: posts(pagination: { limit: 100, offset: 300 }) {
...PostFields
}
posts400: posts(pagination: { limit: 100, offset: 400 }) {
...PostFields
}
posts500: posts(pagination: { limit: 100, offset: 500 }) {
...PostFields
}
posts600: posts(pagination: { limit: 100, offset: 600 }) {
...PostFields
}
posts700: posts(pagination: { limit: 100, offset: 700 }) {
...PostFields
}
posts800: posts(pagination: { limit: 100, offset: 800 }) {
...PostFields
}
posts900: posts(pagination: { limit: 100, offset: 900 }) {
...PostFields
}
}
fragment PostFields on Post {
id
title
content
date
}ã芧ã®ãšãããåé¡ãåŒãèµ·ããããã«ã¯ãšãªããã¹ãããå¿ èŠãããããŸããããã®ãããã¯ãšãªã®è€éãã®åæã¯é£ãããæçšã«ããã«ã¯çްãã調æŽãå¿ èŠã§ãã
ã¯ãšãªåæã®ãµããŒãã远å ããããšæã£ãŠããŸãããåªå 床ã¯é«ããããŸãããããŒã·ã¹ãããã¯ãšãª ã ã«ã¹ã¿ã ãšã³ããã€ã³ã ãš Access Control Lists ã®çµã¿åããã«ãã£ãŠããã§ã«æªæã®ããè¡çºè ãç· ãåºãããšãã§ããŸãããç§ãã¡èªèº«ãèªåã® GraphQL ãµãŒãã¹ãä¹±çšããããšã¯ãªãïŒããŠã¯ãªããªãïŒïŒããã§ãã