如何在 Laravel 中对结果进行分页和排序?

Jos*_*osh 7 laravel laravel-5

我需要对结果进行分页并使用 sortBy() 对它们进行排序,而不丢失分页链接。我还需要使用资源来返回结果。

$sorted = Model::paginate(10)->sortBy('name');

$results = \App\Http\Resources\MyResource::collection($sorted);
Run Code Online (Sandbox Code Playgroud)

这样做会破坏分页链接(我只得到数据部分)。

$paginated = Model::paginate(10);

$results = \App\Http\Resources\MyResource::collection($paginated);

return $results->sortBy('name');
Run Code Online (Sandbox Code Playgroud)

这也是行不通的。有任何想法吗?

ruf*_*ulk 9

使用分页器类中的getCollection()setCollection()方法,您可以更新分页结果而不丢失元数据。

$result = Post::orderBy('another_key')->paginate();
$sortedResult = $result->getCollection()->sortBy('key_name')->values();
$result->setCollection($sortedResult);

return $result;
Run Code Online (Sandbox Code Playgroud)


Tsa*_*oga 5

我认为你可以先对结果进行排序,然后再分页

$sorted = Model::orderBy('name')->paginate(10);
Run Code Online (Sandbox Code Playgroud)

  • 但我与我想要排序的列有 hasOne 关系。我尝试执行 orderBy('user.name') 但它不起作用。 (2认同)

Jos*_*osh 4

我已经用这个解决方案解决了这个问题:

$sorted = Model::get()
    ->sortBy('example_function')  //appended attribute
    ->pluck('id')
    ->toArray();

$orderedIds = implode(',', $sorted);

$result = DB::table('model')
    ->orderByRaw(\DB::raw("FIELD(id, ".$orderedIds." )"))
    ->paginate(10);
Run Code Online (Sandbox Code Playgroud)

我已将 example_function 属性附加到模型中,以供 sortBy 使用。通过这个解决方案,我能够使用 orderBy 按模型的附加属性进行排序。而且我还能够使用分页。