Сортировать переменную Paginated в Laravel - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь отсортировать результат запроса Paginated в Laravel.Мне нужно сделать сортировку, опустив конец всего на мою разбитую на страницы переменную.

Пример:

//get some data attach to variable
$variable = DB::table('exampletable')
->where('id',$somevariable)
->select('id','name')
->paginate(10);

//this function will send the variable and attach **total** on each object
$variable = $this->aFunction($variable);

//What I am trying to do, THIS is where I have to sort in the data flow
$variable->sortBy('total', 'desc');

//return data in json format
return response()->json($variable);

Я попытался отсортировать его, как сказано выше, но в итоге получаю переменнуюпросто иметь имена в каждом сегменте / объекте.Я пытался, и вот результат, который я продолжаю получать:

{
"0":{
      "id": "1",
      "name": "somename",
      "total": "15",
    },
"1":{
      "id": "2",
      "name": "somename2",
      "total": "100",
    },
"2":{
      "id": "3",
      "name": "somename5",
      "total": "26",
    },
}

Что я пытаюсь достичь, так это результат:

"current_page": 1,
"data": [
  {
      "id": "2",
      "name": "somename2",
      "total": "100",
    },
 {
      "id": "3",
      "name": "somename5",
      "total": "26",
    },
 {
      "id": "1",
      "name": "somename",
      "total": "15",
    },
]

1 Ответ

0 голосов
/ 26 ноября 2018

В общем случае

$ paginatedUsers является экземпляром LengthAwarePaginator, описанным здесь: https://laravel.com/api/5.7/Illuminate/Pagination/LengthAwarePaginator.html#method_presenter

Мы можем использовать setCollection для изменения базовой коллекции.И items() для извлечения только объектов на текущей странице.Затем, собрав его, мы можем отсортировать его по своему усмотрению.

$paginatedUsers = User::paginate(3)

$paginatedUsers->setCollection(
    collect(
        collect($paginatedUsers->items())->sortBy('name')
    )->values()
);

полное решение (при условии, что aFunction по-прежнему возвращает объект Paginator)

//get some data attach to variable
$variable = DB::table('exampletable')
->where('id',$somevariable)
->select('id','name')
->paginate(10);

//this function will send the variable and attach **total** on each object
$variable = $this->aFunction($variable);

$variable->setCollection(
    collect(
        collect($variable->items())->sortByDesc('total')
    )->values()
);

//return data in json format
return response()->json($variable);
...