美文网首页
laravel中使用graphql获取数据

laravel中使用graphql获取数据

作者: 谦业 | 来源:发表于2020-02-17 15:45 被阅读0次

laravel中使用graphql获取数据

1. 安装laravel项目,项目名laravel-graphql,laravel版本5.8

% composer create-project --prefer-dist laravel/laravel laravel-graohql "5.8.*"

% cd laravel-graphql

2. 修改数据库配置

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=12345678

3. 创建对应的数据库laravel

4. 安装graphql-laravel package

% composer require rebing/graphql-laravel

添加service provider (laravel5.5+会自动注册)

// 添加到app/config/app.php
Rebing\GraphQL\GraphQLServiceProvider::class,

// 添加alias
'GraphQL' => 'Rebing\GraphQL\Support\Facades\GraphQL',

生成配置文件

% php artisan vendor:publish --provider="Rebing\GraphQL\GraphQLServiceProvider"

5. 创建 GraphQL 的 Query 和 Type

% php artisan make:graphql:type UsersType
% php artisan make:graphql:type JobsType

% php artisan make:graphql:query UsersQuery
% php artisan make:graphql:query JobsQuery

编辑 type文件

app/GraphQL/Types/UserType.php

<?php

declare(strict_types=1);

namespace App\GraphQL\Types;

use App\User;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Facades\GraphQL;
use Rebing\GraphQL\Support\Type as GraphQLType;

class UsersType extends GraphQLType
{
    protected $attributes = [
        'name' => 'Users',
        'description' => '用户',
        'model' => User::class
    ];

    public function fields(): array
    {
        return [
            'id' => [
                'type' => Type::nonNull(Type::int()),
                'description' => '用户id'
            ],
            'name' => [
                'type' => Type::string(),
                'description' => '用户名'
            ],
            'email' => [
                'type' => Type::string(),
                'description' => '用户的email'
            ],
            'job' => [
                'type' => Type::listOf(GraphQL::type('jobs')),
                'description' => '用户的工作字段'
            ]
        ];
    }
}

app/GraphQL/Types/JobsType.php

<?php

declare(strict_types=1);

namespace App\GraphQL\Types;

use App\Job;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Type as GraphQLType;

class JobsType extends GraphQLType
{
    protected $attributes = [
        'name' => 'jobs',
        'description' => '工作',
        'model' => Job::class
    ];

    public function fields(): array
    {
        return [
            'id' => [
                'type' => Type::nonNull(Type::int()),
                'description' => '工作id'
            ],
            'name' => [
                'type' => Type::string(),
                'description' => '工作名'
            ],
            'description' => [
                'type' => Type::string(),
                'description' => '工作职责描述'
            ]
        ];
    }
}

编辑query文件

app/GraphQL/Queries/UsersQuery.php

<?php

declare(strict_types=1);

namespace App\GraphQL\Queries;

use App\User;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Facades\GraphQL;
use Rebing\GraphQL\Support\Query;

class UsersQuery extends Query
{
    protected $attributes = [
        'name' => 'Users query',
        'description' => 'A query'
    ];

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

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

    public function resolve($root, $args)
    {
        $user = new User;

        if(isset($args['limit']) ) {
            $user =  $user->limit($args['limit']);
        }

        if(isset($args['id']))
        {
            $user = $user->where('id' , $args['id']);
        }

        if(isset($args['email']))
        {
            $user = $user->where('email', $args['email']);
        }

        return $user->get();
    }
}

app/GraphQL/Queries/JobsQuery.php

<?php

declare(strict_types=1);

namespace App\GraphQL\Queries;

use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Query;
use Rebing\GraphQL\Support\Facades\GraphQL;

class JobsQuery extends Query
{
    protected $attributes = [
        'name' => 'jobs',
        'description' => 'A query'
    ];

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

    public function args(): array
    {
        return [
            'id' => ['name' => 'id', 'type' => Type::int()],
            'name' => ['name' => 'name', 'type' => Type::string()],
        ];
    }
    
    public function resolve($root, $args)
    {
        $user = new Job();

        if(isset($args['id']))
        {
            $user = $user->where('id' , $args['id']);
        }

        if(isset($args['email']))
        {
            $user = $user->where('name', $args['name']);
        }

        return $user->get();
    }
}
  1. 添加type到config/graphql.php配置中
'types' => [
        'users' => App\GraphQL\Types\UsersType::class,
        'jobs' => App\GraphQL\Types\JobsType::class,
    ],
  1. 添加query到config/graphql.php配置中
'schemas' => [
    'default' => [
        'query' => [
            'users' => App\GraphQL\Queries\UsersQuery::class,
            'jobs' => App\GraphQL\Queries\JobsQuery::class,
        ],
        // ...
    ]
]
  1. 填充测试数据
% php artisan make:seeder UsersTableSeeder
% php artisan make:seeder JobsTableSeeder
// database/seeds/UsersTableSeeder.php

...
class UsersTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('users')->insert([
            'name' => 'kwen',
            'email' => 'email@email.com',
            'password' => bcrypt('123456'),
        ]);
        DB::table('users')->insert([
            'name' => 'kwen1',
            'email' => 'email1@email.com',
            'password' => bcrypt('123456'),
        ]);
    }
}
// database/seeds/JobsTableSeeder.php

...
class JobsTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('jobs')->insert([
            'user_id' => 1,
            'name' => '前端开发工程师',
            'description' => '前端前端'
        ]);
        DB::table('jobs')->insert([
            'user_id' => 2,
            'name' => 'PHP开发工程师',
            'description' => 'PHP'
        ]);
    }
}

修改database/seeds/DatabaseSeeder.php文件

// database/seeds/DatabaseSeeder.php

...
class DatabaseSeeder extends Seeder
{
    public function run()
    {
         $this->call(UsersTableSeeder::class);
         $this->call(JobsTableSeeder::class);
    }
}

用artisan命令进行填充

% php artisan db:seed

安装GraphQL 可视化调试工具

这里使用的是 GraphQL 可视化调试工具,专门针对 Laravel 的 noh4ck/laravel-graphiql

  1. 安装noh4ck/laravel-graphiql package
% composer require "noh4ck/graphiql:@dev"
  1. 打开 ==config/app.php== 并添加以下代码到 ==providers== 中
Graphiql\GraphiqlServiceProvider::class
  1. 发布这个包并生成 config/graphiql.php 配置文件
% php artisan graphiql:publish
  1. 运行 php artisan serve 然后打开 http://127.0.0.1:8000/graphql-ui 就可以打开测试工具的界面了

在 Laravel 中使用 GraphQL 一 获取数据

相关文章

网友评论

      本文标题:laravel中使用graphql获取数据

      本文链接:https://www.haomeiwen.com/subject/kknbfhtx.html