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 许可证授权