optigov/eloquent-graphql

本包提供从Eloquent模型自动创建GraphQL类型和字段的工具。

v3.0.1 2024-09-24 16:03 UTC

README

此包自动从Eloquent模型创建GraphQL类型和字段,并包含它们的解析器,用于webonyx/graphql-php库。该包使用PHP DocBlock注解来确定GraphQL类型和字段。它支持使用查询构建器在返回多个模型的属性上进行分页、过滤和排序,以实现最佳性能。

安装

composer require optigov/eloquent-graphql

使用方法

注解你的模型

为了使字段在GraphQL中可用,请使用@property注解注解你的模型。

/**
 * @property int $id
 * @property string $name
 * @property Author $author
 * @property-read $created_at
 * @property-read $updated_at
 */ 
class Book {
    // ...
}
/**
 * @property int $id
 * @property string $first_name
 * @property string $last_name
 * @property Books[] $books
 * @property-read $created_at
 * @property-read $updated_at
 */ 
class Author {
    // ...
}

构建你的模式

使用EloquentGraphQLService类构建你的模式。

use App\Models\Book;
use App\Models\Author;
use GraphQL\Type\Schema;
use EloquentGraphQL\Services\EloquentGraphQLService;

$graphQLService = new EloquentGraphQLService();

$schema = new Schema([
    'query' => $graphQLService->query()
        ->view(Book::class)
        ->view(Author::class)
        ->all(Book::class)
        ->all(Author::class)
        ->build(),
    'mutation' => $graphQLService->mutation()
        ->create(Book::class)
        ->create(Author::class)
        ->update(Book::class)
        ->update(Author::class)
        ->delete(Book::class)
        ->delete(Author::class)
        ->build(),
]);

更进一步

分页

使用@paginate注解,通过查询构建器分页返回多个模型的属性,例如多对多关系。

/**
 * ...
 * @property Books[] $books @paginate
 * ...
 */
class Author {
    // ...
}

过滤和排序

使用@filterable@orderable注解,通过查询构建器启用返回多个模型的属性上的过滤和排序,例如多对多关系。

/**
 * ...
 * @property Books[] $books @paginate @filterable @orderable
 * ...
 */
class Author {
    // ...
}

自定义字段

您可以使用field()方法向GraphQL类型添加自定义字段。

$schema = new Schema([
    'query' => $graphQLService->query()
        ->view(Book::class)
        ->field('customField', [
            'type' => Type::string(),
            'resolve' => function ($root, $args) {
                return 'Hello World!';
            }
        ])
        ->build(),
]);