按关系计数对pagniation进行排序

时间:2016-02-05 14:14:27

标签: php laravel laravel-5.2

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

我如何在这里使用laravel'

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

会做pagnation,但不会对结果进行排序。

SortBy不是解决方案,因为那时我需要获得所有结果,对它们进行排序然后只挑选10.这是浪费时间。

2 个答案:

答案 0 :(得分:0)

你可以利用collections的力量! 假设您已正确设置模型。

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

将返回按答案数排序的问题集合。有了这个,您可以像这样手动构建Paginator对象(因为paginate方法只能用于Eloquent对象):

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

答案 1 :(得分:-1)

你应该看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对象。