Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
260
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
900
フォロワーがどの雑誌に興味があるのか可視化してみる / magazine-score
kzkohashi
0
750
Laravelを始めて DDDを実践するまで
kzkohashi
2
2k
Amazon Rekognitionを用いてフォロワーの男女比を出す
kzkohashi
1
3k
Other Decks in Technology
See All in Technology
Snowflake Horizon Catalog と Apache Iceberg で作る オープンなデータ基盤
kitagawaz
0
310
AIに賢く動いてもらうためのコンテキスト〜Snowflake女子会 vol.8
snowwmn0824
0
200
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
16
120k
生成AIを使って「人が」考える技術 ― AI時代の人機共想と実践ノウハウ|UNITT AC2026
ishiirikie
0
400
その Lambda、8分で 管理者権限まで奪われます
k1nakayama
7
3.8k
AIは推し活である。
kurazuuuuuu
2
1k
AI臭い文章とは何なのか
nasuvitz
36
71k
猫でもわかるKiro Web
kentapapa
1
150
GitHub Agentic Workflows を触ってみる
htkym
2
860
全社共通データ基盤をつくる。ソニーのDatabricks活用とデータガバナンス設計の裏側
sony
0
180
エージェントはローカル、検証はMicroVM — Lambda MicroVMsでつくるServerless CI
fujioka6789
4
870
OpenClawでAzure DevOpsのWiki更新を自動化する - クラウドAIだけでは届かない場所へ
yutakaosada
0
130
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
10k
Building a Scalable Design System with Sketch
lauravandoore
464
34k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Product Roadmaps are Hard
iamctodd
55
13k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
270
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Discover your Explorer Soul
emna__ayadi
2
1.3k
Practical Orchestrator
shlominoach
192
12k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Docker and Python
trallard
47
4.2k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
380
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ΑΓӡ༻ͦ͢͠͏ʁ