Laravel中的修改响应

时间:2019-01-01 07:22:29

标签: php laravel

在我的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_idid都存储为增量值。

我要更改并返回如下响应;

[
  {
    "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"
          }
        ]
      }
    ]
  }
]

我该如何实现?

3 个答案:

答案 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();

您可以在此处将其与查询构建器一起应用的其余登录信息。