总体来说,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($stories as $story)“循环。
上面的代码工作正常,但没有分页。在sortBy返回错误之前调用分页(分页器类没有sortBy方法),在sortBy之后调用分页也会返回错误。
那么,我将如何分页结果并按动态生成的分数排序呢?谢谢。
发布于 2013-09-14 15:38:17
如注释所示,您可以在分页之前而不是之后进行排序(如果可以的话,这可能意味着使用SQL对其进行排序,而不是根据事实进行排序)。
无论如何,由于缺乏信息,我不确定什么适合您的用例。下面是一些可以使用分页对象的方法,这可能会对您有所帮助。
首先,您可以从Paginator对象中获取这些项:
$stories = Story::paginate();
$models = $stories->getItems();
// And then sort them...其次,如果您需要对项进行排序,然后进行重新分页,您也可以这样做。
$stories = Story::all();
$stories->sortBy( ... );
$paginated = Paginator::make($stories, $total, $perpage);我的任何一种解决方案都不会完全适用于您--例如,这里的最后一个示例获得了所有内容,然后尝试对它们进行排序,并对数据库中的每个故事进行分页(这几乎不符合您想要的内容,就违背了分页的目的)。
希望这能为您提供一些线索,说明如何使用分页对象,如果这种方法可能有用的话。
最后,我建议做的是创建一个后台进程(例如,在cron作业上运行一个命令?)对每一篇文章进行排序,并将排序结果存储在缓存中。然后,您可以从缓存中按特定顺序获取故事ID,并从数据库中获取这些ID。不要尝试加载数据库中的每个故事,对它们进行排序,然后在用户提出的每个页面请求中返回其中的一个子集。
希望这能有所帮助。
https://stackoverflow.com/questions/18795661
复制相似问题