【问题标题】:How to add an element to JSON Laravel pagination object如何向 JSON Laravel 分页对象添加元素
【发布时间】:2019-04-16 00:12:59
【问题描述】:

有了这个请求:

$apps = DB::select("select 
        a.id, a.app_name, a.country_id, a.feature_id, a.organization_id, a.status_id,
        o.organization_name, f.feature_name
        from apps as a
        left join organizations as o on o.id = a.organization_id
        left join features as f on f.id = a.feature_id
        order by app_name
        ");
    
    $apps = DB::table('apps')->orderBy('app_name')->paginate(10);
    return response()->json($apps);

我得到了这个 json:

{
"current_page": 1,
"data": [
    {
        "id": "ab221e40-e711-11e8-b124-95a6d9405f4b",
        "app_name": "Asf autre",
        "country_id": "FR",
        "feature_id": "5724ecad-f8d3-3b5f-bd36-d62e97a26798",
        "organization_id": "44720e79-eaf9-300a-bbcd-cdfce46dbf54",
        "status_id": "PROD",
        "created_by": "6d2aeca8-a29d-38b0-bbd7-8f0c9656ca3b",
        "updated_by": null,
        "created_at": "2018-11-13 07:59:30",
        "updated_at": "2018-11-13 07:59:30"
    },
    {
        "id": "f4ccb480-e711-11e8-a6e6-3b8112548306",
        "app_name": "Asf pays",
       .....

完美。

我想在“数据”键的每个元素中添加一些键。要拥有这种 json:

{
"current_page": 1,
"data": [
    {
        "akeyhere" : "avaluehere",
        "id": "ab221e40-e711-11e8-b124-95a6d9405f4b",
        "app_name": "Asf autre",
        "country_id": "FR",
        "feature_id": "5724ecad-f8d3-3b5f-bd36-d62e97a26798",
        "organization_id": "44720e79-eaf9-300a-bbcd-cdfce46dbf54",
        "status_id": "PROD",
        "created_by": "6d2aeca8-a29d-38b0-bbd7-8f0c9656ca3b",
        "updated_by": null,
        "created_at": "2018-11-13 07:59:30",
        "updated_at": "2018-11-13 07:59:30"
    },
    {
        "akeyhere" : "anothervalue",
        "id": "f4ccb480-e711-11e8-a6e6-3b8112548306",
       .....

你会怎么做?我认为我必须使用“资源”概念,但我从未使用过,我尝试过但没有成功。

【问题讨论】:

  • 在模型上使用 $append 变量和访问器 laravel.com/docs/5.7/…(请记住,这仅在您将模型转换为 json 时才有效,原始查询不起作用)

标签: php json laravel pagination


【解决方案1】:

如果您将 objects 转换为 json,则可以在模型中使用 $append 变量和这样的访问器:

// Get your data using eloquent to retrieve models

$apps = App::orderBy('app_name')->paginate(10);

return response()->json($apps);

然后在你的模型上添加:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class App extends Model
{
    protected $appends = ['akeyhere'];

    public function getAkeyhereAttribute()
    {
        return 'avaluehere';
    }
}

如果您想坚持使用 原始查询查询构建器,您还有以下几种选择:

~ 迭代结果并附加所需的元素。

$paginator->getCollection()->map(function ($element) {

    $element['akeyhere'] = 'avaluehere';

    return $element;
})

~ Hydrate 将结果集转换为 json

$apps = DB::table('apps')->orderBy('app_name')->paginate(10);

$apps = App::hydrate($apps);

return response()->json($apps);

这会将数组的结果集转换为模型,因此您现在可以利用 append 功能。

IMO 你最好利用 Laravel 提供的模型功能,所以如果我是你,我会选择第一个选项。

希望对你有所帮助。

【讨论】:

  • 嗨,阿苏尔,感谢您的回答。我更喜欢继续使用查询生成器。我理解你所说的迭代。但是如何迭代这个 json 的“数据”键?我试过没有成功。 DOM
  • 感谢阿苏尔的帮助。你拯救了我的一天。谢谢。
  • 我已经用更直接的修改分页器的方式更新了我的答案,检查一下。
【解决方案2】:

您当前正在使用查询生成器来构建查询,如果您想“自动”添加您应该使用模型类的属性,这与查询生成器基本相同。

class SomeClass extends Model {
    protected $appends = ['akeyhere'];

    public function getakeyhereAttribute()
    {
        $data = //data from somewhere
        return $data;
    }
}

SomeClass::paginate(10); //will always include `akeyhere`

您也可以使用API Resource 更好地处理您的 api 输出。

【讨论】:

  • 这不适用于 OP 当前的设置,我认为您应该在答案中指出这一点
【解决方案3】:

getCollection() 将返回您的集合的数据部分。你可以使用Laravel集合函数transform来更新你的对象

$apps->getCollection()->transform(function($iterator){
  return array_merge($iterator, [
   // add your extra (key, value) here
  ]);
});

注意

这种方法适用于您不想每次都需要在收藏品中获得额外价值时更新核心模型的情况。

但是

如果有必要并且您在此模型的任何地方都需要这些额外属性,您应该使用Custom Attribute 解决方案。

【讨论】:

  • 很高兴它有帮助。
【解决方案4】:

https://laravel.com/docs/5.7/collections#method-each

$apps = DB::table('apps')->orderBy('app_name')->paginate(10);

$apps->each(function ($item) {
        $item->some_key = 'some_value';
    });

return response()->json($apps);

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 2018-07-20
    • 2012-11-16
    • 2016-04-10
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    相关资源
    最近更新 更多