GraphQL便利ですね!もっと設計したいです。
LaravelでLighthouseを使った実装を進めていて、新しいスキーマを追加する手順についてまとめました。
今まで多くのスキーマを追加してきましたが、基本的には テーブル === モデル === スキーマ
という対応をしています。
そうすることで実装に一貫性をもたせ、スキーマ追加までを手早く行うことができます。
その際の手順についてまとめました。
Sail環境の場合にはphp
をsail
に置き換えてください。
1. サーバサイド
- モデル+マイグレーション作成
- スプレッドシート
- シーダー
1.1. モデル+マイグレーション作成
$ php artisan make:model Post -m
2021_11_05_111111_create_posts_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePostsTable extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up() {
if ( Schema::hasTable( env( 'DB_TABLE_PREFIX' ) . 'banks' ) ) {
return;
}
Schema::create('posts', function ( Blueprint $table ) {
$table->id()->comment( 'ID' );
$table->string( 'code' )->nullable()->comment( '検索用コード' );
$table->string( 'name' )->nullable()->comment( 'ポスト名' );
$table->timestamps();
$table->softDeletes( 'deleted_at' )->comment( '削除日時' );
});
DB::statement( "ALTER TABLE banks comment 'ポスト'" );
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down() {
Schema::disableForeignKeyConstraints();
Schema::dropIfExists( 'posts' );
Schema::enableForeignKeyConstraints();
}
}
1.2. スプレッドシート
Googleスプレッドシートにテストデータを作成しておきます。
GSS API を使ってテストデータをJSON化をします。
/database/seed/Posts.json
[
{
"ID": "1",
"code": "1",
"name": "投稿タイトル1",
"created": "2021-11-05 06:09:51",
"modified": "2021-11-05 06:09:51"
},
...
1.3. シーダー
シードクラスを作成して読み込みを行います。
/database/seeders/PostSeeder.php
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class BankSeeder extends Seeder {
/**
* Run the database seeds.
*
* @return void
*/
public function run() {
\App\Models\Post::factory( 10 )->create();
}
}
ここまでできたらマイグレーション等の実行をして試しておきます。
2. GraphQL(Lighthouse)
サーバサイドのGraphQLを作成します。
- スキーマ
- Query
- Mutation
2.1. スキーマ
/graphql/schemas/post.graphql
"投稿"
type Post {
id: ID!
"コード"
code: String
"投稿タイトル"
name: String
"非表示"
invisible: Boolean
}
2.2. Query
Queryを書きます。
/graphql/query/post.graphql
extend type Query @guard {
"投稿一覧取得"
Posts: [Post!]! @paginate(type: CONNECTION)
"投稿取得"
Post(id: Int! @eq): Post @find
}
2.3. Mutation
Mutationを書きます。
/graphql/mutation/post.graphql
extend type Mutation @guard {
"投稿入力"
mutationPost(input: InputDailyDrivingReport @spread): Post @upsert
}
input InputPost {
"ID"
id: ID
"コード"
code: String
"投稿タイトル"
name: String
}
上記でサーバサイドの実装が完成します。