Laravel sortByDes c и разбить на страницы отношения - PullRequest
0 голосов
/ 09 мая 2020

Как я могу разбить результат здесь и сохранить порядок сортировки.

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 :: sortByDes c ()

$questions = Question::with(['translations' => function($q) use ($language) {
    $q->where('language_id', $language->id);
}])->sortByDesc('translations')->Paginate(20);

Я также пробовал это из этого сообщения: как использовать pangination и sortByDes c fuction в laravel?

$questions = Question::with(['translations' => function($q) use ($language) {
    $q->where('language_id', $language->id);
}])->Paginate(20);
$questions->setCollection($questions->sortByDesc('translations'));

Этот вид работает, потому что я получаю результаты с разбивкой на страницы в отсортированном порядке, но это не то, что мне нужно. Я хочу, чтобы все вопросы сначала были отсортированы по тому, есть ли у них переводы или нет, а затем разбиты на страницы.

Обратите внимание, что переводы - это не столбец, это просто результат запроса, поэтому я не могу использовать SQL как предложено в сообщении, которое я связал.

Модель отношения, о которой идет речь.

public function translations()
{
    return $this->hasMany('App\QuestionTranslation');
}

1 Ответ

0 голосов
/ 09 мая 2020

Упорядочивание отношений не повлияет на порядок основной модели. Отношения извлекаются с помощью второго запроса, который происходит после получения основной модели.

Вы можете 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'));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...