Я пытаюсь понять, почему 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);
}
Обновлено по вашему запросу. в основном нормальная разбивка на страницы показывает то, что я хочу, но в коллекции он меняет формат вывода, который проходит через мой api.
Я считаю, что возврат пытается следовать спецификации json api. Взгляните на красноречивые ресурсы: laravel.com/docs/5.6/eloquent-resources. И спецификация: jsonapi.org
Адам. Я начинаю думать, что вы правы, мне удалось удалить ссылки и метаданные, но я не могу извлечь эту информацию и отформатировать свой возврат коллекции с этой информацией в другом формате.
Просматривая документацию, кажется, что вам нужно будет вернуть производную коллекцию в соответствующую конечную точку.
Ваша производная коллекция ресурсов:
<?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". Мне нужна вся эта информация, но не форматируйте ее таким образом. Мне нужны ссылки и метаинформация за пределами этих атрибутов.
@AlexanderBeyer После того, как покопался в источнике, возможно, вам придется переопределить метод toResponse
. github.com/laravel/framework/blob/5.6/src/Illuminate/Http/…
Да, вам нужно переопределить метод toResponse, чтобы выполнить то, что я хотел, и я не хочу делать это для api. Я просто отмечу это как ограничение стандарта laravel, мы стараемся держаться максимально нестандартно.
Можете ли вы разместить код там, где происходит разбивка на страницы. В Laravel нет метода разбиения на страницы для коллекций.