我想按答案的数量(一对多关系)对问题进行排序。 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
对象。