一般来说,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>
那么我如何对结果进行分页并按动态生成的分数进行排序?感谢。
答案 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。不要尝试加载数据库中的每个故事,对它们进行排序,然后在用户发出的每个页面请求中返回它们的子集。
希望有所帮助。