【问题标题】:Laravel Collection ReturnLaravel 集合返回
【发布时间】:2019-04-03 18:30:21
【问题描述】:

我试图弄清楚为什么 laravel 5.6 当你有一个集合时,它会打印出分页的 json 响应,而不是在分页列表上使用带有 json 的正常返回响应。所以我现在把这个返回到我的收藏中。

{
"data": [],
"links": {
    "first": "http://local/api/v3/x?=1",
    "last": "http://local/api/v3/x?=1",
    "prev": null,
    "next": null
},
"meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 1,
    "path": "http://local/api/v3/x",
    "per_page": "5",
    "to": 3,
    "total": 3
}
}

我希望它看起来像:

{
"current_page": 1,
"data": [],
"first_page_url": "http://local/api/v3/x?=1",
"from": null,
"last_page": 1,
"last_page_url": "http://local/api/v3/x?=1",
"next_page_url": null,
"path": "http://local/api/v3/x",
"per_page": 50,
"prev_page_url": null,
"to": null,
"total": 0
}

我尝试在集合中使用以下代码,但它不起作用,我找到了一些函数来获取我想要的数据,但我仍然缺少大部分数据。

<?php

namespace App\Http\Resources\V3;

use Illuminate\Http\Resources\Json\ResourceCollection;

class DeedTypeCollection extends ResourceCollection
{
public $collects = 'App\Http\Resources\V3\x';

/**
 * Transform the resource collection into an array.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array
 */
public function toArray($request)
{
    return [
        'current_page' => $this->currentPage(),
        'data' => $this->collection,
        'first_page_url' => $this->links['first'],
        'from' => $this->meta['from'],
        'last_page' => $this->meta['last_page'],
        'last_page_url' => $this->links['last'],
        'next_page_url' => $this->links['next'],
        'path' => $this->meta['path'],
        'per_page' => $this->meta['per_page'],
        'prev_page_url' => $this->links['prev'],
        'to' => $this->meta['to'],
        'total' => $this->meta['total']
    ];
}
}

为什么 laravel 会更改集合的默认分页,我该如何解决这个问题以匹配默认/第二个数据集。

这里是构建查询的地方。

/**
 *  Function: prepareIndexSelect.
 *
 *  @param: $request - Request sent to controller
 *
 *  Description: Returns queried collection.
 */
public static function prepareIndexSelect($request)
{
    $model = new self();
    $per_page = 50;
    $page = 1;
    $order_by = $model->getKeyName();
    $sort_by = 'asc';

    if ($request->has('per_page')) {
        $per_page = $request->input('per_page');
    }

    if ($request->has('sortBy')) {
        $order_by = $request->input('sortBy');
    }

    if ($request->has('sortByAsc')) {
        $sort_by = $request->input('sortByAsc');
    }

    if ($request->has('page')) {
        $page = $request->input('page');
    }

    return $model->when($request->has('fields'), function ($query) use ($request) {
        self::prepareSelectColumns($query, $request->input('fields'));
    })->when($request->has('includes'), function ($query) use ($request) {
        self::prepareIncludedTables($query, $request->input('includes'));
    })->whereSearch($request->input('search'))
    ->orderBy("{$order_by}", "{$sort_by}")
    ->paginate($per_page, null, null, $page);
}

【问题讨论】:

  • 你能把代码贴在你的分页发生的地方吗? Laravel 没有集合的分页方法。
  • 根据您的要求更新。基本上正常的分页显示了我想要的方式,但在集合中它改变了输出的格式,这将通过我的 api。
  • 我相信返回是试图遵循 json api 规范。看看雄辩的资源:@​​987654321@。及规格:jsonapi.org
  • Adam 我开始认为您是对的,我已经能够删除链接和元数据,但我无法提取该信息并使用不同格式的该信息格式化我自己的集合返回.

标签: laravel rest laravel-5.6


【解决方案1】:

查看文档,您似乎需要在相应的端点返回您的派生集合。

您的派生资源集合:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\ResourceCollection;

class DeedTypeCollection extends ResourceCollection
{
    /**
     * Transform the resource collection into an array.
     *
     * @param  \Illuminate\Http\Request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'current_page' => $this->currentPage(),
            'data' => $this->collection,
            'first_page_url' => $this->links['first'],
            'from' => $this->meta['from'],
            'last_page' => $this->meta['last_page'],
            'last_page_url' => $this->links['last'],
            'next_page_url' => $this->links['next'],
            'path' => $this->meta['path'],
            'per_page' => $this->meta['per_page'],
            'prev_page_url' => $this->links['prev'],
            'to' => $this->meta['to'],
            'total' => $this->meta['total']
        ];
    }
}

您的端点:

use App\DeedType;
use App\Http\Resources\DeedTypeCollection;

Route::get('/deed-types', function () {
    return new DeedTypeCollection(DeedType::all());
});

您也可以扩展 PaginatedResourceResponse 这应该允许您覆盖 paginationInformation 以按照您需要的方式格式化响应。

protected function paginationInformation($request)
{
    return $this->resource->resource->toArray();
}

然后在您的派生集合中:

public function toResponse($request)
{
    return (new MyDerivedPaginatedResourceResponse($this))->toResponse($request)
}

【讨论】:

  • 路由返回和格式不是我遇到的问题。我遇到的问题是特定于“数据”“链接”“元”的收集标准返回我想要所有这些信息但不是以那种方式格式化我想要这些属性之外的链接和元信息
  • @AlexanderBeyer 在挖掘源代码后,您可能必须覆盖toResponse 方法。 github.com/laravel/framework/blob/5.6/src/Illuminate/Http/…
  • 是的,你必须重写 toResponse 方法来完成我想要的,我不想为 api 这样做。我只是把它归结为对 laravel 标准的限制,我们正努力尽可能地保持开箱即用的 laravel。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 2020-09-04
  • 2019-02-01
  • 2020-01-05
  • 2019-11-27
  • 1970-01-01
相关资源
最近更新 更多