paginate laravel 4 collection&按动态生成的变量排序

时间:2013-09-13 21:39:20

标签: php pagination laravel

一般来说,Laravel框架/ PHP框架相当新,并决定为我的第一个项目构建一个Hacker News克隆。但是,当我尝试通过排序算法对结果进行排序并对结果进行分页时,我遇到了一些问题。

控制器 -

public function index()
{
    // tried Story::paginate(10) here instead, results in error
    $stories = Story::all();

    $stories = $stories->sortBy(function($story) 
    {
         return $story->getScore(); // returns score generated from HN algorithm
    })->reverse();

    return View::make('stories.index')->with('stories', $stories);
}

视图只是一个“foreach($ story as $ story)”循环。

上面的代码工作正常,但没有分页。在sortBy返回错误之前调用paginate(Paginator类没有sortBy方法)并且在sortBy之后调用paginate也会返回错误。< / p>

那么我如何对结果进行分页并按动态生成的分数进行排序?感谢。

1 个答案:

答案 0 :(得分:1)

正如评论所建议的那样,您可以在分页之前进行排序,而不是之后进行排序(这可能意味着使用SQL对其进行排序,如果可以的话,而不是在事后进行排序)。

无论如何,由于缺乏信息,我不确定究竟是什么适合您的使用案例。您可以通过以下方式使用Paginator object来帮助您。

首先,您可以从Paginator对象中获取项目:

$stories = Story::paginate();
$models = $stories->getItems();
// And then sort them...

其次,如果您需要对项目进行排序,然后re-paginate them,您也可以这样做。

$stories = Story::all();
$stories->sortBy( ... );

$paginated = Paginator::make($stories, $total, $perpage);

我的所有解决方案都不会为您完全 - 例如,此处的最后一个示例全部获取,然后尝试对它们进行排序并对数据库中的每个故事进行分页(几乎不是您想要的,打败了分页的目的)。

希望这能为您提供一些关于如何使用分页对象的线索,如果这种方式可能有用。

最后,我可能建议做的是进行后台处理(例如,在cron作业上运行命令?),对每篇文章进行排名,并将排名结果存储在缓存中。然后,您可以从缓存中按特定顺序获取故事ID,并从数据库中获取故障ID。不要尝试加载数据库中的每个故事,对它们进行排序,然后在用户发出的每个页面请求中返回它们的子集。

希望有所帮助。