1

对 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 也会返回错误。

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

4

1 回答 1

1

正如评论所建议的那样,您可以在分页之前而不是之后进行排序(这可能意味着如果可以的话,使用 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,并从数据库中获取它们。不要尝试加载数据库中的每个故事,对它们进行排序,然后在用户提出的每个页面请求上返回它们的子集。

希望有帮助。

于 2013-09-14T15:38:17.613 回答