Возвращение коллекции Laravel

Я пытаюсь понять, почему 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 нет метода разбиения на страницы для коллекций.

Remul 30.10.2018 17:52

Обновлено по вашему запросу. в основном нормальная разбивка на страницы показывает то, что я хочу, но в коллекции он меняет формат вывода, который проходит через мой api.

Alexander Beyer 30.10.2018 17:56

Я считаю, что возврат пытается следовать спецификации json api. Взгляните на красноречивые ресурсы: laravel.com/docs/5.6/eloquent-resources. И спецификация: jsonapi.org

adam 30.10.2018 20:09

Адам. Я начинаю думать, что вы правы, мне удалось удалить ссылки и метаданные, но я не могу извлечь эту информацию и отформатировать свой возврат коллекции с этой информацией в другом формате.

Alexander Beyer 31.10.2018 13:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
4
4 309
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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)
}

Возврат маршрута и формат - это не моя проблема. Проблема, с которой я сталкиваюсь, связана со стандартным возвратом "data" "links" "meta". Мне нужна вся эта информация, но не форматируйте ее таким образом. Мне нужны ссылки и метаинформация за пределами этих атрибутов.

Alexander Beyer 31.10.2018 13:49

@AlexanderBeyer После того, как покопался в источнике, возможно, вам придется переопределить метод toResponse. github.com/laravel/framework/blob/5.6/src/Illuminate/Http/…

adam 31.10.2018 18:52

Да, вам нужно переопределить метод toResponse, чтобы выполнить то, что я хотел, и я не хочу делать это для api. Я просто отмечу это как ограничение стандарта laravel, мы стараемся держаться максимально нестандартно.

Alexander Beyer 14.12.2018 14:42

Другие вопросы по теме