shohag-laraql / lara-ql
LaraQL 是 Laravel 的类似 GraphQL 的包
v1.1.3
2020-05-09 13:38 UTC
README
Laravel API 资源是一个制作 REST API 的出色功能。我们正在使用它来将 eloquent 模型转换为 json 响应。
我们知道每个资源路由给我们七个独立的 API 链接,并且它们的工作几乎相同。我通过使用包装器使其更加通用!
安装
使用以下命令安装最新版本
$ composer require shohag-laraql/lara-ql
模型使用
<?php namespace App\Models; use Shohag\Interfaces\LaraQLSerializer; use Shohag\Models\LaraQLModel; class Division extends LaraQLModel implements LaraQLSerializer { /** * @var one to one model relation */ protected $one2oneFields = [ [ 'self_key' => 'country_id', // current table foreign key 'associate_with' => 'country', // request field 'relative_model' => Country::class // relative model ] ]; public function __construct() { parent::__construct($this); } /** * @param NULL * @return $mixin */ public function country() { return $this->belongsTo(Country::class, 'country_id', 'id')->select(['id', 'name']); } /** * @param NULL * @return Array */ public function serializerFields(): array { return ['id', 'name','country_id', 'country__name']; } /** * @param NULL * @return Array */ public function postSerializerFields(): array { return ['name','country_id']; } /** * @param NULL * @return Array */ public function fieldsValidator(): array { return [ 'name' => 'required', 'country_id' => 'required' ]; } /** * @param NULL * @return Array */ public function createSerializer(): array { return [ 'direct_fields' => [ [ 'level' => 'country', 'model' => Country::class, // country_id foreign key of division table 'fields' => ['id', 'name'] ] ] ]; } /** * @param NULL * @return array */ public function fieldMutation(): array { return [ [ 'field' => 'name', 'method' => function($fieldValue) { return strtoupper($fieldValue); } ] ]; } } ?>
控制器使用
<?php namespace App\Http\Controllers; use App\Models\Division; use Shohag\Controllers\LaraQLController; class DivisionController extends LaraQLController { public function __construct(Division $division) { $this->EntityInstance = $division; parent::__construct(); } }
路由使用
Route::resource('/divisions', 'DivisionController');
Verb Path Action Route Name
GET /divisions index divisions.index
GET /divisions/create create divisions.create
POST /divisions store divisions.store
GET /divisions/{id} show divisions.show
GET /divisions/{id}/edit edit divisions.edit
PUT|PATCH /divisions/{id} update divisions.update
DELETE /divisions/{id} destroy divisions.destroy
使用
文档
无过滤
- divisions GET
/api/divisions
- 响应
{ "data": [ { "id": 3, "name": "Dhaka", "country_id": 1, }, { "id": 2, "name": "Khulna", "country_id": 2, } ] }
单个过滤
- 具有单个过滤器的 divisions:GET
api/divisions?filters=country_id:2
- 响应
{ "data": [ { "id": 2, "name": "Khulna", "country_id": 2, } ] }
多个过滤
- 具有多个过滤器的 divisions:GET
api/divisions?filters=country_id:2,name:Khulna
- 响应
{ "data": [ { "id": 2, "name": "Khulna", "country_id": 2, } ] }
类似过滤
- 具有类似过滤器的 divisions:GET
api/divisions?filters=country_id:2,like~name:ulna
- 响应
{ "data": [ { "id": 2, "name": "Khulna", "country_id": 2, } ] }
查询字段
- 查询字段过滤(仅检索所需字段):GET
/api/divisions?queryFields=id,name
- 响应
{ "data": [ { "id": 2, "name": "Khulna", } ] }
范围过滤
- 范围过滤(1 到 3):GET
/api/countries?filters=b2n_id:1-3
- 响应
{ "data": [ { "id": 3, "name": "India" }, { "id": 2, "name": "India" }, { "id": 1, "name": "Bangladesh" } ] }
排序
- 带有排序的过滤:GET
/api/countries?filters=b2n_id:1-3&queryFields=id,name&order_by=asc
- 响应
{ "data": [ { "id": 1, "name": "Bangladesh" }, { "id": 2, "name": "India" }, { "id": 3, "name": "India" } ] }
外键字段
- 外键查询字段(检索所需的字段):GET
/api/divisions?queryFields=country__name
- 响应
{ "data": [ { "id": 2, "name": "Khulna", "country_id": 1, "country_name": "Bangladesh" } ] }
资源 POST
- 创建新资源:POST:
/api/divisions
- 正文
{ "name": "Mymensingh", "company_id": 1, }
批量 POST
- 创建新批量资源:POST:
/api/divisions
- 正文
{ "bulks": [ { "name": "Sylhet", "country_id": 1, }, { "name": "Rajshahi", "country_id": 1 } ] }
一对一
- 创建具有国家关系的 division(一对一关系数据插入):POST:
/api/divisions
在进行此操作之前,请确保您已从验证方法中删除 country_id 并在模型中添加 $one2oneFields 属性
- 正文
{ "name": "Rajshahi", "country": { "name": "Bangladesh" } }
一对多
- 插入一对多数据:POST:
/api/type
在模型中添加 $one2manyFields 属性
protected $one2manyFields = [
[
'relation_id'=> 'division_id',
'associate_with' => 'divisions',
'relative_model' => Division::class
]
];
- 正文
{ "name": "Division", "items": [ { "name": "sub division" }, { "name": "super division" } ] }
- 创建 divisions:GET:
/api/divisions/create
- 响应
// Model createSerializer() method will be work here
{
"data": {
"country": [
{
"id": 1,
"name": "Bangladesh"
}
]
}
}
字段突变
/** * @param NULL * @return array */ public function fieldMutation() { return [ [ 'field' => 'code', 'method' => function($fieldValue) { return (int)$fieldValue; } ], [ 'field' => 'name', 'method' => function($fieldValue) { return strtoupper($fieldValue); } ] ]; }
作者
许可
LaraQL 包根据 MIT 许可证授权