繁体   English   中英

分页laravel 4集合并按动态生成的变量排序

[英]paginate laravel 4 collection & sort by dynamically-generated variable

一般而言,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之前调用paginate返回错误(Paginator类没有sortBy方法),在sortBy之后调用paginate也返回错误。

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

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

无论如何,由于缺乏信息,我不确定确切适合您的用例。 您可以通过以下几种方式使用Paginator对象 ,这可能会对您有所帮助。

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

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

其次,如果您需要对项目进行排序然后重新对它们进行分页 ,则也可以这样做。

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

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

我的解决方案中没有将确切地为你工作-例如上例中在这里得到一切,然后尝试对它们进行排序,并在数据库中(几乎你想要什么,击败分页的目的)分页每一个故事。

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

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

希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM