zvermafia
@zvermafia
WebDev

Как сделать правильный запрос для сортировки в Laravel?

Есть такой код:
$items = $this->channels;

// Category
if ($request->has('category'))
{
    $items = $items->where('category_id', $request->category);
}

// Sort by default (count_subscribers, DESC)
if ($request->has('sort'))
{
    switch ($request->sort)
    {
        case 'popular':
            $items = $items->votes()
                        ->select(DB::raw('SUM(value) as vote_total'))
                        ->orderBy('vote_total', 'DESC');
            break;

        case 'new':
            $items = $items->latest();
            break;
        
        default:
            $items = $items->orderBy('count_subscribers', 'DESC');
            break;
    }
}
else
{
    $items = $items->orderBy('count_subscribers', 'DESC');
}

$items = $items->whereStatus('active')
    ->with('category', 'attributes')
    ->paginate(12);

return view('frontend/channels/all', [
    'items' => $items,
]);


Надо чтобы когда открывался страница популярных каналов (то есть $request->sort == 'popular') элементы сортировались по сумме проголосованных.
Дело в том что данные голосования находится в отдельной таблице, и после case 'popular' происходит конфликт с общими условиями (а остальные кейсы работают корректно):
$items = $items->whereStatus('active')
    ->with('category', 'attributes')
    ->paginate(12);


Как сделать так чтобы case 'popular' работала корректно и не мешал общим условиям и кейсам?

P.S. Сообщения ошибки:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'status' in 'where clause' (SQL: select count(*) as aggregate from `votes` where `votes`.`voteable_id` is null and `votes`.`voteable_id` is not null and `votes`.`voteable_type` = App\Models\Channel and `status` = active)
  • Вопрос задан
  • 710 просмотров
Решения вопроса 1
zvermafia
@zvermafia Автор вопроса
WebDev
Короче сделал так (но так не хотелось делать), при созданий новой записи (или update/delete) в таблице `votes` я сразу считываю сумму голосований для модели App\Models\Channel и делаю update в таблице `channels.vote_total` (то есть для модели Channel). И изменяю кейс 'popular' на код ниже:
$items = $items->orderBy('vote_total', 'DESC');
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы