shohag-laraql/lara-ql

LaraQL 是 Laravel 的类似 GraphQL 的包

v1.1.3 2020-05-09 13:38 UTC

This package is auto-updated.

Last update: 2024-09-16 03:19:05 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 许可证授权