【问题标题】:Laravel add custom attribute to paginate resultLaravel 添加自定义属性到分页结果
【发布时间】:2020-03-22 03:01:21
【问题描述】:

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

// 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);

我在网上找到了这个方法,但似乎什么都没做......结果与上面的完全一样,没有这个属性。

我找到的另一种方法是放。

$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,
        },
    }
}

有什么帮助吗?谢谢。

【问题讨论】:

    标签: laravel eloquent pagination attributes customization


    【解决方案1】:

    请尝试一下

    $result->totalAmount = $totalAmount;
    

    然后访问它只需使用$result->totalAmount;
    只是一个对象,应该没有问题

    【讨论】:

    • 这可行,但是当控制器以 json 格式返回结果时,属性消失:return response()->json(['datatable' => $sales], 200);
    • 那么在 ste 序列化中该字段消失了吗?
    【解决方案2】:

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

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

    check this out

    【讨论】:

      【解决方案3】:

      试试这个:

      $totalAmount = $sales->sum('amount');
      $result = $sales->paginate($rowsPerPage);
      
      $custom = collect(['totalAmount' => $totalAmount]);
      
      $data = $custom->merge($result);
      

      【讨论】:

        【解决方案4】:

        终于想通了。如果您尝试返回 json 或数组结果,只需先将分页数据更改为数组。然后将你需要的属性添加到数组中。

        $results = $data->paginate()->toArray();
        $results['new_attribute'] = 'Attribute Value';
        return response()->json($result);
        

        合并或附加到分页数据不起作用,因为它在转换为数组时会丢失。

        【讨论】:

          猜你喜欢
          • 2019-03-04
          • 1970-01-01
          • 2020-10-18
          • 2011-12-19
          • 1970-01-01
          • 1970-01-01
          • 2012-07-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多