PHP + Laravel + Lighthouse で GraphQL で通信をするサーバーを構築しています。
DB のテーブルを、ユニークキーではないカラムを検索して更新する処理を実装しているのですが、
1回のクエリで検索と更新を同時にする方法はないでしょうか?
検索クエリで条件にあてはまるレコードのユニークキーを取得し、
Mutation で更新する形で実装はできておりますが、
2回通信してしまっているので、できれば1つにまとめたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
同じような課題を抱えておりましたが
こちらの記事を参考にリゾルバを作成し
graphQLからは検索に必要な項目を渡し
作成したリゾルバ内でlaravelのORMを使い
検索・更新・削除を行う形で私は作成しました。
やりたい形とは違うかもしれせんが、一つのやり方として
以下、その際のソース抜粋です
やっていることは
Versionを検索して
該当なしはレコード新規作成
1件該当があればレコード更新
それ以外は該当レコードを削除して新規作成
該当レコードのidを返却
schema.graphql
type mutation { searchUpdateVersions( ptype: String! module: String! performer: String! version: String! ): VersionIdResponse @field(resolver: "App\GraphQL\Mutations\SearchUpdateVersion@handle") } type VersionIdResponse{ id: ID! }
SearchUpdateVersion.php
php
1<?php 2 3namespace App\GraphQL\Mutations; 4 5use GraphQL\Type\Definition\ResolveInfo; 6use Nuwave\Lighthouse\Support\Contracts\GraphQLContext; 7use App\Version; 8 9class SearchUpdateVersion 10{ 11 12 public function handle( 13 $rootValue, 14 array $args, 15 GraphQLContext $context = null, 16 ResolveInfo $resolveInfo 17 ) { 18 19 $query = Version::query(); 20 $query->where('ptype', $args['ptype']); 21 $query->where('module', $args['module']); 22 $query->where('performer', $args['performer']); 23 24 $versions = $query->get(); 25 26 $version = new Version; 27 28 switch($versions->count()){ 29 case 0: 30 break; 31 case 1: 32 $version = $versions[0]; 33 if($version->version==$args['version']){ 34 $id = $version->id; 35 return compact('id'); 36 } 37 break; 38 default : 39 foreach($versions as $obj) 40 { 41 $obj->delete(); 42 } 43 break; 44 } 45 $version->fill($args); 46 $version->save(); 47 48 $id = $version->id; 49 50 return compact('id'); 51 } 52} 53
投稿2020/07/27 06:55
総合スコア7
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。