Задать вопрос
@Andre548

Как сделать сортировку сначала по непрочитанным сообщениям а потом по дате?

Всем привет! Подскажите по поводу сортировки. Сейчас сортирует по дате создания сообщений. Но в таблице msgs есть поле isread. Как сделать, что бы сначала выводились сообщения у которых isread == 0, а потом по дате?
public function index()
    {
        $alerts = Alert::where('id', '>', 0)
            ->where('user_id', 0)
            ->whereIn('type', ['5', '6'])
            ->select(\DB::raw('MAX(`id`) as id,
                      MIN(`student_user_id`) as student_user_id,
                      MIN(`info`) as info,
                      MIN(`type`) as type,
                      MIN(`name`) as name,
                      MIN(`icon`) as `icon`,
                      MAX(`created_at`) as `created_at`,
                      (SELECT MAX(`created_at`) 
                       FROM msgs 
                       WHERE (msgs.user_id_from = alerts.student_user_id OR msgs.user_id_to = alerts.student_user_id)
                      ) as last_message_time'))
            ->orderBy('last_message_time', 'DESC')
            ->groupBy('student_user_id')
            ->paginate(10);

        return view('alerts.index', ['title' => 'Чат'])
            ->with('alerts', $alerts);

    }
  • Вопрос задан
  • 105 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@iljaGolubev
https://laravel.com/docs/10.x/queries#orderbyraw
для postgres раб
->orderByRaw('CASE isread WHEN 0 THEN 0 ELSE 1 END, last_message_time DESC')


Не ваш случай, но в MySql
можно ещё и так
(не могу найти ссылку на доку)
если нужно отобрать сначала конкретные id
ORDER BY FIELD(id, 100, 100500, 300), last_message_time
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы