basilisk / subresource
允许在一个请求中创建和更新模型及其相关模型
This package is auto-updated.
Last update: 2024-09-13 22:15:26 UTC
README
介绍
SubResource 是一个 Laravel 扩展包,可以在单个请求中创建和更新相关模型。而不是单独创建每个资源并接受管理它们关系的开销,您只需要在模型中指定关系,SubResource 就会完成剩下的工作。假设您有房子、房间和家具模型。一种解决方案是分别定义所有家具、房间和房子,然后定义它们之间的关系。第二种解决方案是将它们一起定义,通过向房子端点发送请求,如下所示
{
... //house properties
rooms: [
{
... //room1 properties
furnitures: [
{
.../furniture1 properties
},
.
.
.
]
},
.
.
.
]
}
SubResource 接收上述请求并自动定义房子、房间和家具。
安装
使用 Composer 安装
composer require basilisk/subresource
入门
Subresource 非常容易使用。所需做的就是向模型添加一个名为 subResourcesConfigs 的公共属性,它接受一个子关系数组。回到我们的例子,假设房子模型如下所示
class House extends Model
{
public function rooms()
{
return $this->hasMany(Room::class);
}
}
如果您想通过 House 端点创建和更新房间,您只需要将 subResourcesConfigs 属性添加到模型中,如下所示
class House extends Model
{
public $subResourcesConfigs = ['rooms'];
public function rooms()
{
return $this->hasMany(Room::class);
}
}
要管理通过 Room 的家具,您还必须在 Room 模型的 subResourcesConfigs 属性中添加 Furniture 关系的名称。现在您可以通过房子创建/更新房间和家具。请确保在请求中设置 Content-type 为 application/json,并将 SubResources 数据放在 JSON 请求体的相同键名下。例如,在上面的例子中,房间数据应位于 rooms 键下,因为在 House 模型中,对 Room 模型的关系名为 rooms。要使用 SubResource,您需要使用 SubResource Facade,它提供了 store 和 update 方法
SubResource::store(\Illuminate\Http\Request $request,
ParentModelClass::class);
SubResource::update(\Illuminate\Http\Request $request,
ParentModelObjectWeTriedToUpdate);
SubResource 使用事务,因此强烈建议使用支持事务的数据库引擎。
更新
要更新子资源,您需要在 JSON 请求中指定资源 ID。例如,假设您想更新 ID 为 "80" 的房子及其房间和每个房间的家具,那么您需要向 "base_url/house/80" 发送 PUT/PATCH 请求,以下是一个示例请求体
{
... //house properties
rooms: [
{
id: x,
... //room1 properties
furnitures: [
{
id: x,
.../furniture1 properties
},
.
.
.
]
},
.
.
.
]
}
如果您在更新请求中未提供子资源的 ID,则会将其视为新资源,因此会创建一个新的子资源并将其与父资源关联。回到我们的例子,如果房子有三个房间,而在更新请求体中您只提供了两个现有房间,则第三个房间将与房子解除关联。换句话说,父元素和子元素之间的关系将被删除,但如果您希望同时删除子资源,则需要在 subResourcesConfigs 中指定 removeOrphanResources
class House extends Model
{
public $subResourcesConfigs = [
'rooms' => ['removeOrphanResources' => true]
];
public function rooms()
{
return $this->hasMany(Room::class);
}
}
在已指定子资源与另一个父资源关联的情况下,如果关系是 多对多,则子资源将与父资源关联,同时与先前父资源关联,但如果关系是 一对一 或 多对一,则子资源将与先前父资源解除关联并关联到新父资源。如果您只想更新父元素而保留子元素不变,则可以删除 JSON 请求中的子资源相关键。
支持的关联类型
目前 子资源 包支持以下关联类型
- 多对多
- 多对一
- 一对一
不久的将来,包也将添加对多态关系的支持。