【问题标题】:Sort a Paginated variable in Laravel在 Laravel 中对分页变量进行排序
【发布时间】:2019-04-27 17:12:13
【问题描述】:

我正在尝试在 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",
    },
]

【问题讨论】:

    标签: mysql laravel laravel-5 laravel-query-builder


    【解决方案1】:

    一般

    $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);
    

    【讨论】:

    • 我已经很接近了!感谢您提供的示例非常有帮助,我刚刚阅读了该文档,谢谢。如果有意义的话,我几乎需要降低一层,以便获取变量并按降序排序。不过谢谢你,如果你知道我的意思,请更新你的评论。
    • 更新了答案。看来您可能还需要在某些时候添加 ->values(),但我相信您会弄清楚的。
    猜你喜欢
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    相关资源
    最近更新 更多