在 Laravel 中使用 GraphQL 二 [修改数据]

在Laravel中使用GraphQL 二【修改数据】

上一章节主要介绍了在 Laravel 中如何搭建 GraphQL 环境,如何使用 GraphQL 进行基础的查询数据还有如何使用 Graphiql 进行测试数据,本章继续探讨如何在 Laravel 中使用 GraphQL 进行新增和修改数据,新增和修改数据主要使用的是 Mutations

什么是 Mutations(变更)

GraphQL 的大部分讨论集中在数据获取,但是任何完整的数据平台也都需要一个改变服务端数据的方法。

在 REST 中,约定了不要使用 GET 请求来修改数据,GraphQL 也是如此,在技术上而言,任何查询都可以看成是数据写入。因此需要建立一个约定来规范任何导致写入的操作都应该通过变更(mutation)来发送。

在 Laravel 中使用 Mutation

新增数据

首先在 GraphQL 目录下面如图创建所需 Mutation,这里分别创建了 CreateUserMutation.phpCreateJobMutation.php ,一个是创建用户的,一个是创建工作的

目录结构

代码部分...

// CreateUserMutation.php

<?php

namespace App\GraphQL\Mutation;

use GraphQL\Type\Definition\Type;
use GraphQL;
use Folklore\GraphQL\Support\Mutation;
use App\Models\User;

class CreateUserMutation extends Mutation
{
    protected $attributes = [
        'name' => 'CreateUser'
    ];

    public function type()
    {
        return GraphQL::type('users');
    }

    public function args()
    {
        return [
            'name' => [
                'name' => 'name',
                'type' => Type::nonNull(Type::string())
            ],
            'email' => [
                'name' => 'email',
                'type' => Type::nonNull(Type::string())
            ],
            'password' => [
                'name' => 'password',
                'type' => Type::nonNull(Type::string())
            ]
        ];
    }

    public function resolve($root, $args)
    {
        $args['password'] = bcrypt($args['password']);
        $user = User::create($args);
        if (!$user) {
            return null;
        }
        return $user;
    }
}
// CreateJobMutation.php

<?php

namespace App\GraphQL\Mutation;

use App\Models\User;
use GraphQL\Type\Definition\Type;
use GraphQL;
use Folklore\GraphQL\Support\Mutation;
use App\Models\Job;

class CreateJobMutation extends Mutation
{
    protected $attributes = [
        'name' => 'CreateJob'
    ];

    public function type()
    {
        return GraphQL::type('jobs');
    }

    public function args()
    {
        return [
            'userId' => [
                'name' => 'userId',
                'type' => Type::id()
            ],
            'name' => [
                'name' => 'name',
                'type' => Type::nonNull(Type::string())
            ],
            'description' => [
                'name' => 'description',
                'type' => Type::nonNull(Type::string())
            ]
        ];
    }

    public function resolve($root, $args)
    {
        $job = new Job([
            'name' => $args['name'],
            'description' => $args['description'],
        ]);
        $user = User::find($args['userId']);
        if (!$user) return null;
        $user->job()->save($job);
        return $job;
    }
}

增加了两个 Mutation 之后不要忘了在 graphql.php 中注册这两个 Mutation

   // graphql.php
   ...
   'schemas' => [
        'default' => [
            'query' => [
                'users' => App\GraphQL\Query\UsersQuery::class,
                'jobs' => App\GraphQL\Query\JobsQuery::class,
            ],
            'mutation' => [
                'createUser' => App\GraphQL\Mutation\CreateUserMutation::class,
                'createJob' => App\GraphQL\Mutation\CreateJobMutation::class,
            ]
        ]
    ],
    ...

然后就可以创建用户了

image

image

接下来创建 Job,创建完之后查询一遍 user,即可发现 User 和 Job 都新增进去了

image

修改数据

下面来看看如何修改数据,原理和新增数据差不多,只不过是修改一下修改数据时候的逻辑

// App/GraphQL/UpdateUserMutation.php

<?php

namespace App\GraphQL\Mutation;

use GraphQL\Type\Definition\Type;
use GraphQL;
use Folklore\GraphQL\Support\Mutation;
use App\Models\User;

class UpdateUserMutation extends Mutation
{
    protected $attributes = [
        'name' => 'UpdateUser'
    ];

    public function type()
    {
        return GraphQL::type('users');
    }

    public function args()
    {
        return [
            'id' => [
                'name' => 'id',
                'type' => Type::nonNull(Type::int())
            ],
            'name' => [
                'name' => 'name',
                'type' => Type::nonNull(Type::string())
            ],
            'email' => [
                'name' => 'email',
                'type' => Type::nonNull(Type::string())
            ]
        ];
    }

    public function resolve($root, $args)
    {
        $user = User::find($args['id']); // 获取传入参数的id
        if (!$user) {
            return null;
        }
        // 通过获取到的user直接修改值
        $user->name = $args['name'];
        $user->email = $args['email'];
        $user->save();

        return $user;
    }
}

然后就可以看到效果

image

image

直接请求地址获取数据

如果你不想通过gui,也就是 graphiql 进行可视化测试,你也可以直接请求地址的形式进行访问,例如:

请求 http://127.0.0.1:8000/graphql?query=query+FetchUsers{users{id,email}}

image

基本上在使用 graphql 作为 API 语言后,所请求的接口只有一个,就是 /graphql ,除非你在自定义别的接口。

一般请求的 url 规则如下:

请求url:端口/graphql?query=请求方式(query还是mutation)+ 方法名{返回字段或者是请求参数}

总结

这篇文章简单介绍了如何在 Laravel 中使用 GraphQL 进行新增和更新数据,其实还有删除数据,但是原理都一样,相信你们都知道应该怎么写,如果对 GraphQL 不熟悉的朋友可以看我上一篇文章 在 Laravel 中使用 GraphQL 一【获取数据】,在之后的文章中还会简单实现配合 jwt-auth 进行用户认证,在最后还会使用 Laravel + GraphQL + Vue 开发一个博客项目,也算记录我学习 graphQL 的总结吧。

github: https://github.com/kwen8/laravel-graphql-t...

本作品采用《CC 协议》,转载必须注明作者和本文链接
kwen
本帖由 Summer 于 6年前 加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 2

你好 GraphQL + jwt鉴权的文章出炉了吗? 期待精彩分享

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!