2016-02-05 77 views
1

我想根據他們的答案數量(一對多關係)對問題進行排序。 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的pagnation?

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

將做pagnation,但不排序的結果。

SortBy是沒有解決方案,因爲那麼我需要得到所有結果,然後對它們進行排序,然後僅挑選10個。這是浪費大量時間。

回答

-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對象。

+0

但這已經無關物品分揀。 – mimo

+0

我不想訂購我的關係芯片,我想數一下,然後按計數值排序, – mimo

0

您可以利用collections的威力!
幫助您正確設置模型。

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

將返回按答案數排序的問題集合。有了這個,你可以手工創建一個Paginator對象像這樣(因爲paginate方法只能在雄辯的對象使用):

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

我想過這個,但他提到sortBy在一個集合上並不是一個解決方案,因爲你必須加載所有的結果。 – enriqg9

+0

分頁在Laravel中以這種方式工作,如果您不想加載所有結果,我建議用'take'和'skip'方法手動限制它們。但是我認爲如果不加載每個結果,您就不會受益於分頁。 – shempignon