Laravel 5.1通过外部数据和分页进行强有力的查询排序

时间:2015-07-11 20:54:27

标签: laravel pagination laravel-5 eloquent

我试图从Eloquent查询中获取数据(有效),然后对数据进行排序,然后对数据进行分页。

我按日期排序代码,然后分页,但现在我想通过facebook API获取数据(我正确获取数据)。

问题是我不知道我应该先做什么(分页或订购):

  • 如果我先分页,我不知道如何订购数据,因为该对象是LengthAwarePaginator并且没有任何orderBy方法。
  • 如果我先订购,我会收到一个收集对象,并且无法使用 - > paginate($ perPage)进行分页。

这是代码:

$posts = Post::with('User')->
                where('created_at', '<', new \DateTime)->
                paginate($perPage);
$counter = 0;
foreach ($posts as $post) {
    $url = 'http://myweb.com/' . $post['id'];
    $fb_stuff = json_decode(file_get_contents('https://api.facebook.com/method/links.getStats?urls=' . $url . '&format=json'), true);
    $posts[$counter]['share_count'] = $fb_stuff[0]['share_count'];
    $counter++;            
}

1 个答案:

答案 0 :(得分:0)

如果您需要按照未存储在数据库中的某个值进行排序,那么唯一的选择是从数据库中获取所有记录,从外部源(Facebook API)获取排序数据,按用户定义的函数对其进行排序(见http://php.net/manual/en/function.usort.php)然后分页。

对数据进行排序后,您可以通过创建Paginator对象轻松获取分页版本:

$paginator = new \Illuminate\Pagination\Paginator($posts, $perPage, $currentPage);

无论如何,这个解决方案将非常繁重,因为每次你想要一个排序的帖子列表时你需要从Facebook API获取数据。我怀疑您需要实时数据,因此我建议将share_count存储在您的帖子表中并定期刷新,例如通过运行预定的laravel命令。