繁体   English   中英

Laravel sortByDesc 和 Paginate 关系

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM