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)
我怎样才能实现这个结构?
从我看来,你的问题只是关系。要创建“树资源”,您必须加载很多关系。
恕我直言,这不是一个好的选择,特别是如果你必须加载很多元素,但一般来说,像这样的结构可能是一个危险的瓶颈。
无论如何...简单的方法是急切加载,因此您必须使用此属性添加基本模型(查看官方文档)
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每个关系到叶子的资源中。
| 归档时间: |
|
| 查看次数: |
4430 次 |
| 最近记录: |