# GraphQL Mutation の作成2

データの作成ができたので、次は更新、削除の Mutaion も作成していきましょう。

# 更新の Mutation

タスクのデータを更新するような Mutation を考えてみましょう。 例えば、 IDを指定して、タスクのhas_done 列を更新するような タスク完了のMutationです。

タスク完了の Mutation を定義するには schema.graphql の末尾に 以下のような定義を追加します。

extend type Mutation {
    archieveTask(id: ID): Task!
}

Mutation の処理を実装するために、 app/GraphQL/Mutations/ArchieveTask.php を作成して以下のような Mutation 処理を記述してみましょう。

<?php
namespace App\GraphQL\Mutations;

use App\Models\Task;

class ArchieveTask
{
    public function __invoke($rootValue, array $args)
    {
        $task = new Task();
        $task =$task->find($args["id"]);
        $task->has_done = true;
        $task->save();

        return $task;
    }
}

$args より ID 値を取得し、Eloquent の find 関数でデータの取得をおこなっています。

Eloquent では、new して作成したインスタンスを save すると行が新規で追加されますが、 Eloquent 経由で取得したインスタンスを変更して save すると 既存の行の更新になります。

altair で 以下のようなクエリを発行することで、IDで指定されたタスクの has_done 列が更新されるのが確認できるでしょう。


mutation{
  archieveTask(name: "宅配ボックスの確認", priority: 4){
    name
    priority
  }
}

# 削除の Mutation

次に、タスクのデータを削除するような Mutation を考えてみましょう。 処理は、更新とほとんど同様で、IDで指定されたタスクを削除するMutationを作成していきます。

タスク削除の Mutation を定義するには schema.graphql の末尾に 以下のような定義を追加します。

extend type Mutation {
    deleteTask(id: ID): Task!
}

Mutation の処理を実装するために、 app/GraphQL/Mutations/DeleteTask.php を作成して以下のような Mutation 処理を記述してみましょう。

<?php
namespace App\GraphQL\Mutations;

use App\Models\Task;

class DeleteTask
{
    public function __invoke($rootValue, array $args)
    {
        $task = Task::find($args['id']);
        $task->delete();

        return $task;
    }
}

$args より取得した ID 値と Eloquent の find 関数でデータの取得を行うのは、 更新の Mutation と同じです。

削除のMutationでは、データの削除を行うために、 取得したインスタンスに対して、delete関数を呼び出しています。

altair で 以下のようなクエリを発行することで、IDで指定されたタスクがデータベースから削除されるのが確認できるでしょう。


mutation{
  deleteTask(id: 1){
    name
    priority
  }
}

# Check!

次のステップに進む前に以下の内容をもう一度確認しておきましょう。

  • PHP で定義した Mutation クラスの内容で、データの更新や削除処理が定義できますか?