basilisk/subresource

允许在一个请求中创建和更新模型及其相关模型

dev-main 2021-08-13 15:18 UTC

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,它提供了 storeupdate 方法

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 请求中的子资源相关键。

支持的关联类型

目前 子资源 包支持以下关联类型

  • 多对多
  • 多对一
  • 一对一

不久的将来,包也将添加对多态关系的支持。