lexxsoft / odata
Laravel OData 请求解析器
Requires
- php: >=8.1
- ext-dom: *
Requires (Dev)
- laravel/framework: ^10.5
README
内容
安装
要求
设置
composer require lexxsoft/odata
安装后,所有路由 /odata/* 都将可访问
php artisan vendor:publish --provider="Lexxsoft\Odata\Providers\OdataServiceProvider"
之后将出现 config/odata.php 文件。
更新模型要求
要将模型作为 OData 实体,必须使用 Restable 特性。
use LexxSoft\odata\Traits\Restable; class Log extends Model { use HasFactory, Restable; }
OData 功能
- 元数据
- CRUD
- Create
- Read
- Update
- Delete
- OData 实体
- OData 请求
- 资源路径
- 简单请求(例如
/odata/category) - 计数请求(例如
/odata/category/$count) - 通过键请求(例如
/odata/category(1)) - 单个字段值请求(例如
/odata/category(1)/name) - 值请求(例如
/odata/category(1)/name/$value) - 嵌套实体请求(例如
/odata/category(1)/products) - 计数嵌套实体(例如
/odata/category(1)/products/$count) - 深度嵌套实体(例如
/odata/category(1)/products(2)/supplier/address/city/$value)
- 简单请求(例如
- 系统查询选项
-
$orderby -
$top -
跳过 -
$filter- EQ
- NE
- GT
- GE
- LT
- LE
- AND
- OR
- NOT
- substringof
- endswith
- startswith
-
$expand- 简单展开(例如
$expand=products) - 深度展开(例如
$expand=products/supplier) - 带计数展开(例如
$expand=products($count=true))
- 简单展开(例如
-
$select -
$count=true(例如$inlinecount)
-
- 自定义查询选项(例如
/odata/products?x=y)
- 资源路径
数据操作
读取数据
要读取数据,请使用 GET 请求。您还可以从 OData 功能 部分添加查询参数
GET /odata/role?$top=5
读取 ID 为 1 的用户
GET /odata/user(1)
更新数据
要更新数据,应使用 PUT 方法。然后,通过新数据填充请求体。
请求示例
PUT /odata/role(2)
{
"name": "User role"
}
更新关系
要更新多对多关系,需要传递关联字段名称的 ID 数组
{
"id": 2,
"permissions": [
5,
6,
7
]
}
使用中继更新关系
有时多对多表有额外的字段。要更新它们,传递关联字段的对象数组。
注意,键字段是必需的。
{
"id": 2,
"permissions": [
{
"id": 5,
"author": "Larry"
},
{
"id": 8,
"author": "John"
}
]
}
创建数据
要创建新记录,请使用 POST 请求类型
POST /odata/role
{
"name": "New role"
}
删除数据
要删除数据,请使用具有记录键的 DELETE 请求
DELETE /odata/role(2)
使用自定义控制器方法
OData 插件可以自动执行几乎所有 CRUD 操作。但有些情况应单独处理。为了实现这一点,OData 插件将在路径 /app/Http/Controllers 中搜索模型控制器,文件名为 <单数实体名称>Controller.php 模式。如果找到控制器文件,第二步将在控制器类中搜索对应的方法。方法名与资源控制器相同。使用下表检查您案例的方法名
例如,您有一个 User 模型和为其创建的 UserController。但是,当您进行 odata HTTP 请求时,您使用复数名称,如 /odata/users。请注意这一点。
数据验证规则
例如,create 或 update 等操作应验证来自客户端的数据。为此,使用 ValidationRulesGenerator 类。它根据数据库字段描述为 仅 Restable 模型生成验证规则。默认情况下,它仅生成 fillable 字段的规则。
Spatie laravel permissions
如果您使用Spatie的laravel-permission,那么默认情况下Role模型和Permission模型不会使用Restable特性。要使它们成为RESTable的,您应该创建自己的模型(例如,通过php artisan make:model命令),并从\Spatie\Permission\Models\*模型扩展这些新模型。
/** Extended Role model */ namespace App\Models; use Lexxsoft\Odata\Primitives\Restable; class Role extends \Spatie\Permission\Models\Role { use Restable; }
/** Extended Permission model */ namespace App\Models; use Lexxsoft\Odata\Traits\Restable; class Permission extends \Spatie\Permission\Models\Permission { use Restable; }