Laravel将自定义属性添加到分页结果

时间:2019-11-26 16:19:54

标签: laravel eloquent pagination attributes customization

我正在尝试向分页结果中添加一些数据。 这是代码:

// query select and filter
[...]

$totalAmount = $sales->sum('amount');
$result = $sales->paginate($rowsPerPage);
return $result;

结果是:

{
    "datatable": {
        "current_page": 1,
        "data": [
            {
                "sale": 13047689,
                "customer": "0017850000104",
                "date": "2015-12-23 23:15:06",
                "amount": "129.84",
            }
        ],
        "first_page_url": "http://intranet/api/user/sales/datatable?custom=value&page=1",
        "from": 1,
        "last_page": 1,
        "last_page_url": "http://intranet/api/user/sales/datatable?custom=value&page=1",
        "next_page_url": null,
        "path": "http://intranet/api/user/sales/datatable",
        "per_page": "10",
        "prev_page_url": null,
        "to": 1,
        "total": 1
    }
}

我想将totalAmount添加到该分页对象中。

我尝试过的事情:

$result->appends('totalAmount', $totalAmount);

我在Internet上找到了此方法,但似乎没有任何作用...结果与上面的完全一样,没有此属性。

我发现了另一种方法。

$result->put('totalAmount', $totalAmount);

此方法确实有效,但不是我需要的方法。这是为了在结果中添加一些行,因为它会将属性添加到“数据”中。当我将此结果传递给数据表时,这破坏了我的代码。

{
    "datatable": {
        "current_page": 1,
        "data": {
            "0": {
                "sale": 13047689,
                "customer": "0017850000104",
                "date": "2015-12-23 23:15:06",
                "amount": "129.84",
            },
            "totalAmount": "129.84"
        },
        "first_page_url": "http://intranet/api/user/sales/datatable?page=1",
        "from": 1,
        "last_page": 1,
        "last_page_url": "http://intranet/api/user/sales/datatable?page=1",
        "next_page_url": null,
        "path": "http://intranet/api/user/sales/datatable",
        "per_page": "10",
        "prev_page_url": null,
        "to": 2,
        "total": 1
    }
}

我该怎么办?

我想要这个:

{
    "datatable": {
        "current_page": 1,
        "data": [
            {
                "sale": 13047689,
                "customer": "0017850000104",
                "date": "2015-12-23 23:15:06",
                "amount": "129.84",
            }
        ],
        "first_page_url": "http://intranet/api/user/sales/datatable?page=1",
        "from": 1,
        "last_page": 1,
        "last_page_url": "http://intranet/api/user/sales/datatable?page=1",
        "next_page_url": null,
        "path": "http://intranet/api/user/sales/datatable",
        "per_page": "10",
        "prev_page_url": null,
        "to": 2,
        "total": 1,
        "totalAmount": "129.84"
    }
}

否则,下一步将是:

{
    "datatable": {
        "current_page": 1,
        "data": [
            {
                "sale": 13047689,
                "customer": "0017850000104",
                "date": "2015-12-23 23:15:06",
                "amount": "129.84",
            }
        ],
        "first_page_url": "http://intranet/api/user/sales/datatable?page=1",
        "from": 1,
        "last_page": 1,
        "last_page_url": "http://intranet/api/user/sales/datatable?page=1",
        "next_page_url": null,
        "path": "http://intranet/api/user/sales/datatable",
        "per_page": "10",
        "prev_page_url": null,
        "to": 2,
        "total": 1,
        "totalData": {
            "accumulated1": 235,
            "accumulated2": 799,
            "accumulated3": 1680,
        },
    }
}

有帮助吗?谢谢。

3 个答案:

答案 0 :(得分:0)

请尝试使用

$result->totalAmount = $totalAmount;

然后使用$result->totalAmount;即可访问它。
这只是一个对象,应该没有任何问题

答案 1 :(得分:0)

您需要先为响应创建资源,然后添加元数据以得到如下结果:

return (new UserCollection(User::all()->load('roles')))
                ->additional(['meta' => [
                    'key' => 'value',
                ]]);

check this out

答案 2 :(得分:0)

尝试一下:

$totalAmount = $sales->sum('amount');
$result = $sales->paginate($rowsPerPage);

$custom = collect(['totalAmount' => $totalAmount]);

$data = $custom->merge($result);