Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Introduction to using GraphQL for a bit
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kazuki Ohashi
December 19, 2018
Technology
250
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Introduction to using GraphQL for a bit
Kazuki Ohashi
December 19, 2018
More Decks by Kazuki Ohashi
See All by Kazuki Ohashi
larave_vue_graphql_supplementation
kzkohashi
1
890
フォロワーがどの雑誌に興味があるのか可視化してみる / magazine-score
kzkohashi
0
720
Laravelを始めて DDDを実践するまで
kzkohashi
2
2k
Amazon Rekognitionを用いてフォロワーの男女比を出す
kzkohashi
1
3k
Other Decks in Technology
See All in Technology
LLMと共に進化するプロセスを目指して
ymatsuwitter
11
3k
「速く作る」から「正しく作る」へ ─ 生成AI時代の開発フロー改革の ロードマップと実行 ─
starfish719
0
7.7k
価格.comをAI駆動で全面刷新する ー 30年分の技術的負債を返し、次の30年の土台をつくる ー / AI Engineering Summit Tokyo 2026
tkyowa
49
52k
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
1.9k
AI Engineering Summit Tokyo 2026 AIの前に、やることがある 〜医療データ企業の4フェーズ〜
dtaniwaki
0
1.8k
Djangoユーザが知っ得なPostgreSQL機能 - 設計の選択肢を増やす / Djang-use-PostgreSQL
soudai
PRO
0
180
Databricks における 生成AIガバナンスの実践
taka_aki
1
310
AI フレンドリーなエラー監視を TypeScript で実現する
shinyaigeek
2
260
関西に縁あるMicrosoft MVPsが語るCopilotの未来
kasada
0
1.2k
個人最適 から 全体最適 へ AI情報共有会・AIギルド・AI-DLC で進める カンリーの組織展開
rfdnxbro
0
1.5k
Agentic ERPをどう設計するか ー 受発注エージェントを動かす、現場の知見と設計思想ー
recerqainc
1
1.5k
BigQuery の Cross-cloud Lakehouse への歩み
phaya72
2
550
Featured
See All Featured
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
530
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
Why Our Code Smells
bkeepers
PRO
340
58k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
520
Optimising Largest Contentful Paint
csswizardry
37
3.7k
Prompt Engineering for Job Search
mfonobong
0
330
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2k
Designing for humans not robots
tammielis
254
26k
Transcript
ͪΐͬͱ͍ͨ͘ͳΔ (SBQI2-ೖ -BSBWFM 3FBDU ୈճΏΔͪJU(SBQI2-ʹ͍ͭͯΏΔ͘͢ େڮҰथ!L[LPIBTIJ
ࣗݾհ େڮҰथ!L[LPIBTIJ w '*4.גࣜձࣾ$50 w ϓϩμΫτ։ൃ͕͖ w -BSBWFM3FBDU0,3
ຊͷ༰ w (SBQI2-ΛͳΜͱͳͬͯ͘Δঢ়ଶ͔Βͪΐͬͱͬͯ ݟ͍ͨͳͱࢥ͑ΔΑ͏ͳ༰ w ࡉ͔͍༷ͷઆ໌͠ͳ͍ͷͰɺڵຯ͋Δํ ผ్ௐͯͶʂʂ w ࠓճ͋·Γઆ໌͠ͳ͍ͷ ϖʔδωʔγϣϯ
&EHFͱ/PEF
(SBQI2-ͱʁ
ʮεΩʔϚʯͷఆٛʹैͬͯɺΫϥΠΞϯτଆ͕ཉ͍͠ใΛ ʮΫΤϦʔʯͷܗࣜͰ͢ ΫΤϦʔ HSBQIRM جຊతʹ"1*ͷड͚ޱͻͱͭʂ
4DIFNBͱʁ w ͲͷσʔλΛΓͱΓ͢Δ͔ ͷ༰ΛܾΊΔ #BDLFOEଆ w ϑϩϯτΤϯυͱόοΫΤϯ υͷܖ type
Query { hero: Hero } type Hero { name: String friends: [Friend] } type Friend { name: String age: Int address: String } ༧ޠʂSPVUFͷఆٛΈ͍ͨͳΜ ಠࣗͷܕΛఆٛͰ͖Δ ෳฦ͢߹͕͋Δ߹ྻʹ͢Δ
2VFSZͱʁ w (FUϝιουͷ࣌ར༻ w ཉ͍͠σʔλ͚ͩهड़͢Ε ͦΕ͕ฦͬͯ͘Δ { hero { name
friends { name } } } ཉ͍͠ΦϒδΣΫτͷ ϑΟʔϧυ໊Λॻ͘ { hero(id: 1) { name friends { name } } } ˞εΩʔϚมߋ͢Δඞཁ͋Γ ݅Λࢦఆ͢Δ͜ͱͰ͖Δ
.VUBUJPOͱʁ extend type Mutation { createClientAccount( client_id: Int @rules(apply: ["required"])
staff_name: String @rules(apply: ["required"]) tel: String @rules(apply: ["required"]) department: String @rules(apply: ["required"]) email: String @rules(apply: ["required"]) password: String @rules(apply: ["required"]) role: Int @rules(apply: ["required"]) ): ClientAccount @create(model: "App\\Models\\ClientAccount") } w 1045165%&-&5&ϝιουͷ࣌ར༻ w ༧ޠ ϝιου ܕͱόϦσʔγϣϯ Λࢦఆ -BSBWFM
*OQVUͱʁ extend type Mutation { createClientAccount2(input: CreateClientAccount): ClientAccount @create(model: "App\\Models\\ClientAccount",
flatten: true) } input CreateClientAccount { client_id: Int @rules(apply: ["required"]) staff_name: String @rules(apply: ["required"]) tel: String @rules(apply: ["required"]) department: String @rules(apply: ["required"]) email: String @rules(apply: ["required"]) password: String @rules(apply: ["required"]) role: Int @rules(apply: ["required"]) } w .VUBUJPOͳͲͰར༻͢ΔೖྗΛ0CKFDUʹ·ͱΊΔ
&EHFͱ/PEF type InfluencerSearchPage implements Page { paginatorInfo: PaginatorInfo edges: [InfluencerSearchEdge]
} type InfluencerSearchEdge implements Edge { cursor: ID! node: InfluencerSearchNode } w ϖʔδωʔγϣϯ࣌ʹ&EHFͱ/PEFͷ֓೦Λར༻ w &EHF/PEFΛͪɺ/PEF$VSTPSΛ࣋ͭ
࣮ࡍͷσʔλͷσϞ
-BSBWFMͰͷ࣮
ϥΠϒϥϦͷબఆ w ࠓճ-JHIUIPVTFΛར༻ IUUQTHJUIVCDPNOVXBWFMJHIUIPVTF w (SBQI2-ϥΠΫʹεΩʔϚ͕ఆٛͰ͖Δ w طଘͷΞʔΩςΫνϟͰ͙͢ʹऔΓೖΕΒΕΔ
ΞʔΩςΫνϟ ɾεΩʔϚͷఆٛ ɾड͚ޱͷ४උ ɾόϦσʔγϣϯ มߋલ มߋޙ
εΩʔϚͷஔ͖ॴ w SPVUFTHSBQIRMʹఆٛ w ड͚ޱ͝ͱʹ༻ҙ͢Δ΄͏ ͕Αͦ͞͏
εΩʔϚͷఆٛ extend type Query @group(middleware: ["auth:api"]) { client_account(id: ID @eq):
ClientAccount @find(model: "App\\Models\\ClientAccount") client_accounts: [ClientAccount!]! @all } type ClientAccount { id: ID! client_id: Int! staff_name: String! tel: String! department: String! email: String! role: Int! created_at: DateTime! updated_at: DateTime! } ϛυϧΣΞ͕͑Δ Ϟσϧͦͷ··͏ͳΒ͜͜ͰఆٛͰ͖Δ
ಠࣗͷఆٛ extend type Query @group(middleware: ["auth:api"]) { fetchProjects: [PrProject!]! }
type PrProject { id: ID! item_id: Int! project_type: Int! name: String! media_type: Int! item_detail: String! item_image: String! hash_tags: String } .PEFMTʹఆ͕ٛͳ͍ͷ
6TF$BTF͔Βͷฦ٫ <?php namespace App\Http\GraphQL\Queries; use App\Domains\UseCases\FetchProjectList; use GraphQL\Type\Definition\ResolveInfo; use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;
class FetchProjects extends BaseQuery { public function resolve($rootValue, array $args, GraphQLContext $context = null, ResolveInfo $resolveInfo) { $usecase = app(FetchProjectList::class); return $usecase($this->client_id); } } Ϩεϙϯεͷதܕʹม͞ΕΔ
3FBDUͰͷ࣮
ϥΠϒϥϦͷબఆ w ࠓճ3FBDU"QPMMPΛར༻ IUUQTHJUIVCDPNBQPMMPHSBQIRMSFBDUBQPMMP w 'BDFCPPL͕ग़͍ͯ͠ΔެࣜͷϥΠϒϥϦ3FMBZΑΓɺ Θ͔Γͦ͢͏ͳͷͰબ
ΞʔΩςΫνϟ "QPMMP͕৭ʑͬͯ͘ΕΔͨΊɺҎલΑΓؔ࿈͢Δॲཧ͕ඞཁͳ͍
ΫΤϦʔͷఆٛ const GET_SEARCH_INFLUENCER = gql` query ($page: Int!, $name: String){
query_search_influencers(page: $page, influencer_name: $name) { paginatorInfo { total count currentPage } edges { node { id influencer_name instagram_posts { id code comment_count is_video date } } } } } `;
ΫΤϦʔͷൃߦ render() { return ( <div className="GraphList3" style={{ width: "500px"
}}> <Query query={GET_SEARCH_INFLUENCER} variables={{ page: 1, name: "ా" }} > {({ data, error, loading, client, refetch }) => { if (error) return <p>{error.toString()}</p>; let pageInfo, graphData, dataElms; if (!loading) { pageInfo = data.query_search_influencers.paginatorInfo; graphData = data.query_search_influencers.edges; dataElms = graphData && graphData.map((v) => { let data = v.node; return ( <div key={data.id}>{data.influencer_name}</div> ); }); } return ( <div className="GraphList" style={{ padding: "40px"}}> . . . 2VFSZλάͰΫΤϦʔΛൃߦͰ͖Δ Ϩεϙϯεσʔλ͕དྷΔͷͰ ͍ͭ௨Γͷॲཧ
Α͔ͬͨࣄ
εΩʔϚத৺։ൃ w εΩʔϚΛڞ௨ݴޠͱ͠ɺϑϩϯτΤϯυͱόοΫΤϯυ Ͱ༷ͷڞ௨Խ͕Γͦ͏ w Ҏલ͔Β4XBHHFSΛ͍͕ͬͯͨɺඞਢͷमਖ਼Ͱͳ͍ͨ Ί์ஔؾຯʹͳ͍ͬͯͨ w ૹ͍͚ͬͯͳ͍ΧϥϜͷνΣοΫ༰қʹͳΓͦ͏
ཉ͍͠ใΛཉ͍࣌͠ʹ w ϑϩϯτΤϯυใ͕গͳ͘ͳخ͍͠ w αʔόʔαΠυใ͕গͳ͘ͳΓخ͍͠ w Ϣʔβʔʢϒϥβʣใ͕গͳ͘ͳΓخ͍͠
ͦͷଞ w QMBZHSPVOE͕ਆπʔϧ w -JHIUIPVTF͚ͩͰݟΕ։ൃ׆ൃ
՝
ॲཧͷ w όοΫΤϯυ-JHIUIPVTFͷมʹΑΓɺdNT ͘ͳΔ w ϑϩϯτଆࠓͷͱ͜Ζͳͦ͞͏
ॲཧͷվળํ๏ w εέʔϧΞοϓ ຊ൪ͱಉ͡ڥͰ·ͩࢼͯ͠ͳ͍ͷͰͦͷ··ɾɾ w ϥΠϒϥϦͷมߋ -BSBWFMͱ૬ੑ͍͍ͭ୳͢ͷେมͳͷͰ-JHIUIPVTFͷ· ·͕͍͍ɾɾ w ଞͷϛυϧΣΞͰվળ
(SBQI2-ʹ͠ͳ͍߹Ͱ༗ޮͳͨΊͪ͜ΒͨΊ͢
վળᾇ &MBTUJD4FBSDI ࣮ࡍʹࢼͯ͠ݟͨ ɾdNTૣ͘ͳͬͨ ɾӡ༻͕େม͚ͩͲɺΑͦ͞͏
վળᾈ 7BSOJTI 7BSOJTIΛೖΕΔ ɾϨεϙϯεࣗମΛશͯΩϟογϡ༧ఆ ɾ"VUIपΓͷઃఆ͚ͩؾΛ͚ͭΔ ɾ̍ճΩϟογϡ͞ΕΔਓҎ֎͓ͦΒ͘ɺ ̍̌ͷ̍Ҏ্ૣ͘ͳΔͱ༧
վળᾉ "QBDI*HOJUF "QBDIF*HOJUFΛೖΕΔ ɾσʔλϕʔεࣗମΛࢄΩϟογϡ͢Δ ɾޮՌ͋Γͦ͏ͩ͠ɺ ɹ&4ΑΓӡ༻ͦ͢͠͏ʁ