adeey/graphql-php

1.0.46 2024-05-10 17:21 UTC

This package is not auto-updated.

Last update: 2024-09-27 19:02:08 UTC


README

此库可以从 PHP 数组构建一个可用的查询/突变字符串

安装

composer require adeey/graphql-php

<?php

require 'vendor/autoload.php';

use MaxGraphQL\Types\Query; // For Query
use MaxGraphQL\Types\Mutation; // For Mutation

使用步骤

使用步骤

  1. 使用突变/查询名称创建新的类对象 $mutation = new Mutation('name');

  2. 添加您想要选择的内容 $mutation->addSelect(['test', 'name']);

    2.1 或者您可以传递一个字段名称

     $mutation->addSelect('name');
     $mutation->addSelect('test');
     $mutation->getSelect(); // ['name', 'test']
  3. 向您的查询添加参数(过滤器) $mutation->addArguments(['test' => 123]);

  4. 获取构建的查询 $mutation->getPreparedQuery();

  5. 在您的请求中使用该字符串

或者

您可以通过调用静态方法构建字符串

// $arguments is optional
Mutation::getPreparedQueryFrom('nameOfYourMutation', $selected, $arguments);
Query::getPreparedQueryFrom('nameOfYourQuery', $selected, $arguments);

这两种方法都将返回字符串

方法

可以从中调用的方法

  1. 返回当前所选字段 $object->getSelect()
  2. 返回当前参数 $object->getArguments()

参数/选择在哪里?

query {
    HEREYOURNAME( argument: "ITS MY ARGUMENT" ) {
        HERE SELECT
    }
}

示例 PHP 代码

$query = new Query('HEREYOURNAME');
$arguments = [
    'argument' => 'ITS MY ARGUMENT'
];
$select = [
    'HERE SELECT'
];
$query->addSelect($select);
$query->addArguments($arguments);
$query->getPreparedQuery(); // and here ours query

如何构建这样的查询?这很简单

query {
    users(
        format: ALL,
        filter: {
            activeUsers: true,
            userIds: [1,2]
        }
    ) {
        id
        name
        code
        password
        channels {
            id
            titles {
                id
            }
        }
        ... on UserAdmin {
            userAdminLevel
        }
    }
}

PHP 代码

use MaxGraphQL\FieldTypes\Enum;

$whatIWantToSelect = [
    'id',
    'name',
    'code',
    'password',
    'channels' => [
        'id',
        'titles' => [
            'id'
        ]
    ],
    '... on UserAdmin' => [
        'userAdminLevel'
    ]       
];

$filteringArguments = [
    'format' => new Enum('ALL'), // if you want write enum values you need to use Enum class
    'filter' => [
        'activeUsers' => true,
        'userIds' => [1,2]
    ]
];

$query = new Query('users');
$query->addSelect($whatIWantToSelect);
$query->addArguments($filteringArguments);
echo $query->getPreparedQuery(); // returns query string

PHP 代码的结果是查询字符串,它与我的 GraphQL 查询相等,并且是从 PHP 数组生成的

query{users(format:ALL,filter:{activeUsers:true,userIds:[1,2]}){id,name,code,password,channels{id,titles{id}},... on UserAdmin{userAdminLevel}}}

如何构建这样的突变?

mutation {
    updateUser(
        id: "321",
        data: {
            name: "Test",
            age: 32,
            admin: false
        }
    ) {
        id
        name
        code
        password
        channels {
            id
            titles {
                id
            }
        }
        ... on UserAdmin {
            userAdminLevel
        }
    }
}

PHP 代码

$whatIWantToSelect = [
    'id',
    'name',
    'code',
    'password',
    'channels' => [
        'id',
        'titles' => [
            'id'
        ]
    ],
    '... on UserAdmin' => [
        'userAdminLevel'
    ]       
];

$mutationArguments = [
    'id' => '321', // look that id is in string format
    'data' => [
        'name' => 'Test',
        'age' => 32, // and the age is int
        'admin' => false
    ]
];

$mutation = new Mutation('updateUser'); // updateUser - name of mutation
$mutation->addSelect($whatIWantToSelect);
$mutation->addArguments($mutationArguments);

echo $mutation->getPreparedQuery(); // returns mutation string

突变字符串结果

mutation{updateUser(id:"321",data:{name:"Test",age:32,admin:false}){id,name,code,password,channels{id,titles{id}},... on UserAdmin{userAdminLevel}}}

其他案例

有时我们想在查询中添加额外的过滤器,如下所示

query {
    users {
        all(pageSize: 25) {
            name
            ...
        }
    }
}

我们需要这样写

$whatWeNeedToSelect = [
    'all(pageSize: 25)' => [
        'name',
        ...    
    ]
];