[英]Laravel sortByDesc and Paginate on a relationship
如何在此处对结果进行分页并保持排序顺序。
public function show(Language $language)
{
$questions = Question::with(['translations' => function($q) use ($language) {
$q->where('language_id', $language->id);
}])->get()->sortByDesc('translations');
return view('language.show', compact('questions', 'language'));
}
现在,如果我尝试通过这样做进行分页,我会收到一条错误消息:调用未定义的方法 Illuminate\Database\Eloquent\Builder::sortByDesc()
$questions = Question::with(['translations' => function($q) use ($language) {
$q->where('language_id', $language->id);
}])->sortByDesc('translations')->Paginate(20);
我也从这篇文章中尝试过: 如何在 laravel 中使用 pangination 和 sortByDesc 功能?
$questions = Question::with(['translations' => function($q) use ($language) {
$q->where('language_id', $language->id);
}])->Paginate(20);
$questions->setCollection($questions->sortByDesc('translations'));
这种工作是因为我按排序顺序获得了分页结果,但这不是我想要的。 我希望所有问题首先按是否有翻译进行排序,然后进行分页。
请注意,翻译不是一列,它只是查询的结果,所以我不能按照我链接的帖子中的建议使用 SQL。
有问题的关系 model。
public function translations()
{
return $this->hasMany('App\QuestionTranslation');
}
排序关系对主model的顺序没有影响。 通过第二个查询检索关系,该查询发生在检索主 model 之后。
但是,您可以join
:
public function show(Language $language)
{
$questions = Question::selectRaw('questions.*, translations.id')
->leftJoin('translations', function ($join) use ($language) {
$join->on('questions.id', '=', 'translations.question_id')
->andOn('translations.id', '=', $language->id);
})
->orderBy('translations.id') // NULLs should appear last
->paginate(20);
return view('language.show', compact('questions', 'language'));
}
private $limit = 10;
public function show(Language $language)
{
$questions = Question::with(['translations' => function($q) use ($language) {
$q->where('language_id', $language->id);
}]);
$data = $questions->paginate($this->limit);
$data->sortByDesc('translations');
return view('language.show', $data);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.