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

Как изменить код для сортировки сообщений сначала по полю isread, а затем по дате создания? 

```php
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('isread', 'ASC')
        ->orderBy('last_message_time', 'DESC')
        ->groupBy('student_user_id')
        ->paginate(10);

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

}
  • 19 сентября 2023 г. 11:47
Ответы на вопрос 3
Для сортировки сообщений сначала по полю isread, а затем по дате создания, вы можете изменить код следующим образом:

```php
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'))
        ->orderByRaw('-isread ASC, last_message_time DESC')
        ->groupBy('student_user_id')
        ->paginate(10);

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

В данном коде используется функция `orderByRaw`, которая позволяет создать собственное выражение для сортировки. С помощью `-isread ASC` мы сортируем по возрастанию значения поля `isread`, а `last_message_time DESC` сортирует по убыванию значения поля `last_message_time`.
https://laravel.com/docs/10.x/queries#orderbyraw для PostgreSQL: раб - > 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
Похожие вопросы