如何向Laravel分页json响应添加自定义属性

时间:2018-09-28 16:54:07

标签: json laravel laravel-5 response

我有以下简单的索引方法:

public function index()
    {
       // dd(Poll::paginate(2));
      return response()->json(Poll::paginate(2),200);
    }

该方法的输出类似于以下json对象:

{
"current_page": 1,
"data": [
{
"id": 1,
"title": "I suppose?' said Alice. 'Why, you don't know.",
"created_at": "2018-09-14 16:42:11",
"updated_at": "2018-09-14 16:42:11"
},
{
"id": 2,
"title": "Alice; but she knew that it seemed quite.",
"created_at": "2018-09-14 16:42:11",
"updated_at": "2018-09-14 16:42:11"
}
],
"first_page_url": "http://127.0.0.1:8000/polls?page=1",
"from": 1,
"last_page": 6,
"last_page_url": "http://127.0.0.1:8000/polls?page=6",
"next_page_url": "http://127.0.0.1:8000/polls?page=2",
"path": "http://127.0.0.1:8000/polls",
"per_page": 2,
"prev_page_url": null,
"to": 2,
"total": 11
}

我想在"total: 11"属性之后添加另一个数组属性,例如:

,
"anotherData" : [
   "userId": 1,
   "userName": "john10",
   "message": "This is a message"
]

我已经尝试了解response()->json()的工作原理,因此它可以从LengthAwarePaginator对象中提取一些数据,该数据是{{ 3}},但是我无法理解如何从Poll::paginate(2)获取一个将结果键保存在json对象中的数组?!

2 个答案:

答案 0 :(得分:0)

从认为的resource abovejson()方法采用一个数组,我猜想,如果参数不是数组,则它会尝试将其转换为数组,特别是如果它是一个对象像LengthAwarePaginator,所以它可以使用toArray()方法。

我尝试将return response()->json(Poll::paginate(2),200)替换为return response()->json(Poll::paginate(2)->toArray,200),然后得到相同的输出。因此,我决定替换索引方法的代码,如下所示:

public function index()
{
    //dd(Poll::paginate(2)->toArray());
    $output = Poll::paginate(2)->toArray();
    $output['userData'] = ['userId' => \Auth::user()->id, 'userEmail' => \Auth::user()->email];
    return response()->json($output,200);
}

结果输出为:

...
"path": "http://127.0.0.1:8000/polls",
"per_page": 2,
"prev_page_url": null,
"to": 2,
"total": 11,
"userData": {
"userId": 1,
"userEmail": "lion@example.com"
}
}

答案 1 :(得分:0)

如果您直接使用分页数据进行响应,更好的选择是将其包装在 Resource Collectionadding meta data 中。

我就是这样实现的。

CategoryController.php

public function index()
{
    return new CategoryCollection(Category::paginate(10));
}

CategoryCollection.php

public function toArray($request)
{
    return [
        'status' => 1,
        'message' => 'Success',
        'data' => $this->collection,
    ];
}

由于 Collection 扩展 JsonResource,当从控制器返回时,您的响应将自动转换为 JSON。