【问题标题】:Getting error while using GroupBy and Pagination in Eloquent在 Eloquent 中使用 GroupBy 和 Pagination 时出错
【发布时间】:2017-12-10 13:22:52
【问题描述】:

我正在尝试使用 eloquent 让我按响应分组,同时给我一个分页响应(给我第二页链接的那个)。 我正在尝试这样做:

App\Eating::Where('student_id', 2)->orderBy('created_at', 'DESC')->groupBy(function ($row) {
     return Carbon\Carbon::parse($row->created_at)->format('Y-m-d');
})->paginate(25);

但是,我在 Tinker 中运行时遇到了这个错误:

PHP warning:  strtolower() expects parameter 1 to be string, object given in D:\Folder\vendor\laravel\framework\src\Illuminate\Database\Grammar.php on line 58

没有 groupBy,我得到了正确的结果:

>>> App\Eating::Where('student_id', 2)->orderBy('created_at', 'DESC')->paginate(25)->toArray();
=> [
     "total" => 1,
     "per_page" => 25,
     "current_page" => 1,
     "last_page" => 1,
     "next_page_url" => null,
     "prev_page_url" => null,
     "from" => 1,
     "to" => 3,
     "data" => [
       [
         "id" => 5,
         "status" => "Comeu Bem",
         "created_at" => "2017-07-05 13:55:25",
         "updated_at" => "2017-07-05 13:55:25",
       ],
     ],
   ]

但是,当我删除分页时,我确实收到了错误,但这只是因为我添加了 get():

>>>  App\Eating::Where('student_id', 2)->orderBy('created_at', 'DESC')->groupBy(function ($row) {
...                          return Carbon\Carbon::parse($row->created_at)->format('Y-m-d');
...                      })->get();
PHP warning:  strtolower() expects parameter 1 to be string, object given in D:\Joao\git\F1Softwares\Code\Server\F1Softwares\vendor\laravel\framework\src\Illuminate\Database\Grammar.php on line 58
>>>
>>>  
>>>  App\Eating::Where('student_id', 2)->orderBy('created_at', 'DESC')->groupBy(function ($row) {
...                          return Carbon\Carbon::parse($row->created_at)->format('Y-m-d');
...                      });
=> Illuminate\Database\Eloquent\Builder {#855}

知道我做错了什么吗?我确实需要 orderBy 和分页,以使应用程序更容易显示结果(这是一个 RestFul 调用)。

谢谢, 若昂

【问题讨论】:

    标签: mysql laravel pagination eloquent laravel-eloquent


    【解决方案1】:

    您必须在集合上调用groupBy() 方法,但这似乎不适用于paginate()。您可以尝试在集合上使用forPage() 方法:

    App\Eating::where('student_id', 2)->orderBy('created_at', 'DESC')
        ->get()->groupBy(function ($eating) {
             return $eating->created_at->format('Y-m-d');
        })->forPage(1, 25);
    

    另外,请注意,您不需要使用 Carbon 来解析日期,Eloquent 会为您完成这项工作。


    或者,您可以在使用Illuminate\Pagination\LengthAwarePaginator 对集合进行分组后尝试manually create your paginator

    $eatings = App\Eating::where('student_id', 2)->orderBy('created_at', 'DESC')
                   ->get()->groupBy(function ($eating) {
                       return $eating->created_at->format('Y-m-d');
                   });
    $paginatedEatings = new LengthAwarePaginator($eatings, $eatings->count(), 25);
    
    return $paginatedEatings->toArray();
    

    【讨论】:

    • 感谢您的回复!我的问题是我失去了分页的结果。我确实需要 next_page_link,但使用这种方法,我将数据分组,但没有分页。结果:=> Illuminate\Database\Eloquent\Collection {#891 all: [ "2017-07-05" => Illuminate\Database\Eloquent\Collection {#909 all: [ App\Eating {#945 id: 5, status : "Comeu Bem", created_at: "2017-07-05 13:55:25", }, ], },
    • 啊,我现在知道它是如何没有分页的......在阅读了文档之后,虽然看起来你不能同时使用这两者:“目前,无法执行使用 groupBy 语句的分页操作通过 Laravel 高效地使用。如果您需要使用带有分页结果集的 groupBy,建议您查询数据库并手动创建分页器。 laravel.com/docs/5.4/pagination
    猜你喜欢
    • 1970-01-01
    • 2015-06-17
    • 2018-07-25
    • 2020-08-06
    • 2022-12-28
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    相关资源
    最近更新 更多