在我的Laravel控制器代码下面
public function templateValueData($template_id)
{
$parent = TemplateMetadataValue::where('template_id', $template_id)->get();
return $parent;
}
这里是上面方法的输出;
[
{
"id": 11,
"parent_id": 0,
"name": "Category 1"
},
{
"id": 63,
"parent_id": 11,
"name": "Category 2"
},
{
"id": 73,
"parent_id": 63,
"name": "Category 3"
},
{
"id": 77,
"parent_id": 11,
"name": "Category 5"
},
{
"id": 83,
"parent_id": 77,
"name": "Category 8"
}
]
现在,我想根据parent_id
的值来格式化此响应。
条件是:当parent_id
等于id
时,则parent_id
被视为id
的子代。
请注意,parent_id
和id
都存储为增量值。
我要更改并返回如下响应;
[
{
"id": 11,
"parent_id": 0,
"name": "Category 1",
"children": [
{
"id": 63,
"parent_id": 11,
"name": "Category 2",
"children": [
{
"id": 73,
"parent_id": 63,
"name": "Category 3"
}
]
},
{
"id": 77,
"parent_id": 11,
"name": "Category 5",
"children": [
{
"id": 83,
"parent_id": 77,
"name": "Category 8"
}
]
}
]
}
]
我该如何实现?
答案 0 :(得分:1)
使用以下代码获得您的回应。
public function templateValueData($template_id)
{
$parents = TemplateMetadataValue::where('template_id', $template_id)->get();
$arr = $this->xyz($parents);
return $arr;
}
实现响应的功能。
function xyz($parents,$parent_id = 0){
$res = [];
foreach ( $parents as $parent ) {
if ( $parent[ "parent_id"] == $parent_id ){
$children = $this->xyz($parents, $parent[ "id"]);
if ($children) {
$parent[ "children"] = $children;
}
$res[]=$parent;
}
}
return $res;
}
答案 1 :(得分:0)
您应该在控制器上调用您的关系:
public function templateValueData($template_id)
{
$parent = TemplateMetadataValue::where('template_id',$template_id)->with('children')->get();
return $parent;
}
您还可以在控制器方法上使用方法注入,因此可以使用以下代码:
public function templateValueData(TemplateMetadataValue $template)
{
return $template->load('children')->get();
}
答案 2 :(得分:0)
如果您稍微修改TemplateMetadataValue
模型,则可以实现所需的结果。
class TemplateMetadataValue extends Model {
public function children() {
return $this->hasMany(static::class, 'parent_id');
}
}
使用children
方法进行调用。
$parent = TemplateMetadataValue::with('children')->get();
您可以在此处将其与查询构建器一起应用的其余登录信息。