Laravel替代分页收集吗?

时间:2019-07-24 14:21:05

标签: laravel

在我的网站上,我有提交,提交的内容可以有评论。

评论可以有增票或有票,导致评论的总“得分”。

在此示例中,在将评论传递给视图之前,我按分数对它们进行排序。

$comments = Comment::where('submission_id', $submission->id)->where('parent_id', NULL)->get();

$comments = $comments->sortByDesc(function($comment){
    return count($comment['upvotes']) - count($comment['downvotes']);
});     

这很好。评论的分数越高,其排序程度越高。

但是,我想对这些结果进行分页。

如果我使用->paginate(10)而不是get(),则以下sortByDesc将仅对这10个结果进行排序。

从逻辑上讲,我想在sortByDesc之后添加分页符,如下所示:

$comments = $comments->sortByDesc(function($comment){
    return count($comment['upvotes']) - count($comment['downvotes']);
})->paginate(10);   

但是这将返回错误:

  

方法Illuminate \ Database \ Eloquent \ Collection :: paginate不   存在。

符合预期。

我的问题是,在这种情况下使用分页替代品有什么选择?

编辑:

尝试@ party-ring的响应(并切换双引号和单引号)时,出现以下错误:

  

SQLSTATE [42000]:语法错误或访问冲突:1064您有一个   您的SQL语法错误;检查与您的手册相对应的手册   MariaDB服务器版本,用于在'[“ upvotes”]附近使用的正确语法)   -count($ comment [“ downvotes”])desc限制10在行1处偏移0'(SQL:从comments中选择*,其中submission_id = 1并且parent_id是   按计数为空的顺序($ comment [“ upvotes”])-   count($ comment [“ downvotes”])desc limit 10 offset 0)

2 个答案:

答案 0 :(得分:0)

尝试一下:

$comments = Comment::where('submission_id', $submission->id)
    ->where('parent_id', NULL)
    ->orderBy(DB::raw("count($comment['upvotes']) - count($comment['downvotes'])"), 'desc')
    ->paginate(10);`

SortBy返回一个Collection,而您只能在QueryBuilder实例上调用paginate。 OrderBy应该返回QueryBuilder的实例,并且您应该能够使用DB::raw语句进行减法。

**编辑

我刚刚阅读了orderByRaw,这在这种情况下可能会有用:

$comments = Comment::where('submission_id', $submission->id)
    ->where('parent_id', NULL)
    ->orderByRaw('(upvotes - downvotes) desc')
    ->paginate(10);`

由于我不知道您的注释表的结构,您可能需要对上面的减法进行一些操作。

几个可能有用的链接:

答案 1 :(得分:0)

您正在尝试在获取内容后进行分页,我在我的网站上尝试的解决方案是这样并且有效

$users = User::where('votes', '>', 100)->get();

$page = Input::get('page', 1); // Get the ?page=1 from the url
$perPage = 15; // Number of items per page
$offset = ($page * $perPage) - $perPage;

return new LengthAwarePaginator(
    array_slice($users->toArray(), $offset, $perPage, true), // Only grab the items we need
    count($users), // Total items
    $perPage, // Items per page
    $page, // Current page
    ['path' => $request->url(), 'query' => $request->query()] // We need this so we can keep all old query parameters from the url
);