Laravel API 资源:如何返回无限嵌套的类别数组及其子项?

Fre*_* II 3 php api laravel jsonapi-resources laravel-6

我使用 Laravel 6.x,以下是我的响应 JSON。

{
    "data": [
        {
            "id": 1,
            "name": "quam",
            "parent_id": 0
        },
        {
            "id": 2,
            "name": "quia",
            "parent_id": 1
        },
        {
            "id": 3,
            "name": "beatae",
            "parent_id": 1
        },
        {
            "id": 4,
            "name": "aut",
            "parent_id": 2
        },
        {
            "id": 5,
            "name": "provident",
            "parent_id": 0
        },
        {
            "id": 6,
            "name": "voluptate",
            "parent_id": 0
        },
        {
            "id": 7,
            "name": "vel",
            "parent_id": 2
        },
        {
            "id": 8,
            "name": "sed",
            "parent_id": 3
        },
        {
            "id": 9,
            "name": "voluptates",
            "parent_id": 0
        },
        {
            "id": 10,
            "name": "adipisci",
            "parent_id": 6
        },
        ...
    ]
}
Run Code Online (Sandbox Code Playgroud)

但它想是这样的:

{
    "data": [
        {
            "id": 1,
            "name": "quam",
            "children": [
                {
                   "id": 2,
                   "name": "quam"
                   "children":[
                       {
                           "id": 4,
                           "name": "aut"
                       },
                       {
                           "id": 7,
                           "name": "vel",
                           "children": [
                                ...
                           ]
                       }
                   ]
                 },
                 {
                   "id": 3,
                   "name": "quam",
                   "children":[
                       {
                           "id": 8,
                           "name": "sed"
                       }
                   ]
                 },
            ]
        },
        {
            "id": 5,
            "name": "provident"
        },
        {
            "id": 6,
            "name": "voluptate",
            "children": [
                 {
                      "id": 10,
                       "name": "adipisci"
                 }
            ]
        },
        {
            "id": 9,
            "name": "voluptates"
        },
        ...
}
Run Code Online (Sandbox Code Playgroud)

实际上,我想删除该parent_id属性并将children数组添加到由其他对象组成的每个对象中,该对象具有此 parent_id。

分类资源.php

{
    "data": [
        {
            "id": 1,
            "name": "quam",
            "parent_id": 0
        },
        {
            "id": 2,
            "name": "quia",
            "parent_id": 1
        },
        {
            "id": 3,
            "name": "beatae",
            "parent_id": 1
        },
        {
            "id": 4,
            "name": "aut",
            "parent_id": 2
        },
        {
            "id": 5,
            "name": "provident",
            "parent_id": 0
        },
        {
            "id": 6,
            "name": "voluptate",
            "parent_id": 0
        },
        {
            "id": 7,
            "name": "vel",
            "parent_id": 2
        },
        {
            "id": 8,
            "name": "sed",
            "parent_id": 3
        },
        {
            "id": 9,
            "name": "voluptates",
            "parent_id": 0
        },
        {
            "id": 10,
            "name": "adipisci",
            "parent_id": 6
        },
        ...
    ]
}
Run Code Online (Sandbox Code Playgroud)

类别控制器.php

{
    "data": [
        {
            "id": 1,
            "name": "quam",
            "children": [
                {
                   "id": 2,
                   "name": "quam"
                   "children":[
                       {
                           "id": 4,
                           "name": "aut"
                       },
                       {
                           "id": 7,
                           "name": "vel",
                           "children": [
                                ...
                           ]
                       }
                   ]
                 },
                 {
                   "id": 3,
                   "name": "quam",
                   "children":[
                       {
                           "id": 8,
                           "name": "sed"
                       }
                   ]
                 },
            ]
        },
        {
            "id": 5,
            "name": "provident"
        },
        {
            "id": 6,
            "name": "voluptate",
            "children": [
                 {
                      "id": 10,
                       "name": "adipisci"
                 }
            ]
        },
        {
            "id": 9,
            "name": "voluptates"
        },
        ...
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现这个结构?

IlG*_*ala 6

从我看来,你的问题只是关系。要创建“树资源”,您必须加载很多关系。

恕我直言,这不是一个好的选择,特别是如果你必须加载很多元素,但一般来说,像这样的结构可能是一个危险的瓶颈。

无论如何...简单的方法是急切加载,因此您必须使用此属性添加基本模型(查看官方文档

class Parent extends Model {

  // [...]

  /**
   * The relationships that should always be loaded.
   *
   * @var array
   */
  protected $with = ['children'];

  // [...]

  public function children() {
     return $this->hasMany('whatever');
  }
}
Run Code Online (Sandbox Code Playgroud)

接下来,您必须按如下方式更新您的 JSON 资源(为此,请查看有关资源关系官方文档)。

class CategoryResource extends JsonResource
{

    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'parent_it' => $this->parent_id,
            'childrend' => ChildrenResource::collection($this->whenLoaded('children')),
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,由于每次请求 a 时,Parent它都会急切加载其子项,因此资源将递归映射到Child每个关系到叶子的资源中。