按关系计数对分页进行排序


Sort pagniation by relationship count

我想按答案的数量(一对多关系)对问题进行排序。 orderBy仅适用于列,但在这种情况下,我需要按值排序。

SELECT
  answers.question_id,
  count(*) AS Counter
FROM answers, questions
WHERE answers.id = questions.id
WHERE question.year > 2014
GROUP BY answers.question_id
ORDER BY `Counter` DESC

我如何在这里使用拉拉维尔的分页?

$questions->where('year', '>', 2014)
    ->paginate(10)

将进行分页,但不对结果进行排序。

SortBy 不是解决方案,因为这样我需要获取所有结果,对它们进行排序,然后只选择 10 个。这是巨大的时间浪费。

你可以利用集合的力量!
断言您已经正确设置了模型。

$questions = Question::with('answers')->get()->sortBy(function($question) {
    return $question->answers->count();
});

将返回按答案数量排序的问题集合。有了这个,你可以像这样手动构建一个分页对象(因为paginate方法只能在 Eloquent 对象上使用):

$questions = new Illuminate'Pagination'Paginator($questions, 10);
// 10 being the number of results per page.

你应该看看whereHas(),它允许你在你们的关系上放一个where子句。

// Retrieve all posts with at least one comment containing words like foo%
$posts = Post::whereHas('comments', function ($query) {
    $query->orderBy('name', 'desc');
})->get();

然后,在您的情况下,您可以运行paginate()而不是get()来获取LenghtAwarePaginator对象。