在我的网站上,我有提交,提交的内容可以有评论。
评论可以有增票或有票,导致评论的总“得分”。
在此示例中,在将评论传递给视图之前,我按分数对它们进行排序。
$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)
答案 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
);