@Amenov_Abdul

Как сделать сортировку по условию в Laravel?

Привет всем!
Пожалуйста подскажите, как сделать сортировку по условию в Laravel?
Задача такая:
есть в таблице поле с датой, если дата больше текущей даты то должна с работать функция ->orderBy('top_date', 'DESC')
Вот код:
return User::where('is_deleted', '0')
      ->with(['langs', 'categories'])
      ->where('is_published', true)
      ->where('subscription', '>=', now())
      ->orderBy('balls', 'DESC')
      ->filter($filters)
      ->paginate(15);
  • Вопрос задан
  • 154 просмотра
Решения вопроса 1
@Kostik_1993
Fullstack Web Developer | PHP | Laravel | Vue.js
Вам нужно сделать вот такой запрос
SELECT * FROM users u ORDER BY CASE WHEN u.top_date > NOW() THEN u.top_date END DESC, u.balls DESC


На Laravel это будет выглядеть примерно так
return User::where('is_deleted', '0')
      ->with(['langs', 'categories'])
      ->where('is_published', true)
      ->where('subscription', '>=', now())
      ->orderByRaw('CASE WHEN top_date > NOW() THEN top_date END DESC, balls DESC')
      ->filter($filters)
      ->paginate(15);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Kulaxyz
@Kulaxyz
Могу лучше
Предложу костыль, может у более опытных товарищей есть нормальное решение...
$users = User::where('is_deleted', '0')
            ->with(['langs', 'categories'])
            ->where('is_published', true)
            ->where('subscription', '>=', now())
            ->orderBy('balls', 'DESC')
            ->filter($filters)
            ->paginate(15);
        foreach ($users as $user) {
            if ($user->top_date > Carbon::now()) {
                $users = $users->sort(function ($user) {
                    return $user->top_date;
                });
                break;
            }
        }
        return $users;
Ответ написан
@GssGenic
Программист со стажем более 20 лет.
Я бы предложил

// подготовка запроса 
$query =  User::where('is_deleted', '0')
      ->with(['langs', 'categories'])
      ->where('is_published', true)
      ->where('subscription', '>=', now())
      ->orderBy('balls', 'DESC');

// Проверка на условие 
if ($query->where('top_date', '>=', now())->count()) - будет лишний запрос в базу и если не 0 то добавляем к запросу сортировку.
     {$query = $query->orderBy('top_date', 'DESC');}

// выполнение Запроса.
$query = $query->filter($filters)
                          ->paginate(15);


В Этом случае нагрузку передаем на SQL сервер.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
17 июн. 2021, в 00:44
40000 руб./за проект
17 июн. 2021, в 00:12
100000 руб./за проект
17 июн. 2021, в 00:05
2000 руб./за проект