Подгрузка старых записей и вывод в обратном порядке
Подскажите как сделать подгрузку сообщений, как в вк, при скроллинге вверх, добавляем предыдущие сообщения offset это число на которое смещаем выборку, но здесь идет от последнего id к первому, и не знаю как делать смещение и вывод сообщений в обратном порядке
$messages = DB::table('dialog_messages')
->leftJoin('user_attributes','user_attributes.user_id','=','dialog_messages.user_id')
->select('user_attributes.avatar','user_attributes.fullname','dialog_messages.replay','dialog_messages.created_at','user_attributes.user_id','dialog_messages.id')
->where('dialog_messages.dialog_id','=', $request->dialog_id)
->orderBy('dialog_messages.id','DESC')->paginate(15);
Ответы (1 шт):
Нужно перевернуть полученную коллекцию.
->get()
->reverse();
или отсортировать по id:
->get()
->sortBy('id');
Результаты могут немного отличаться, потому что ты используешь сортировку по времени создания, а она у разных сообщений может быть одинаковой.
В контексте сообщений, я бы рекомендовал сортировать их по id.
Вообще мы писали чат и пришли к выводу, что пагинация сообщений через offset крайне не гибкая штука, и лучше работать через id верхнего сообщения.
Допустим у нас в чате есть 5 сообщений:
id: 10 id: 11 id: 12 id: 13 id: 14
Чтобы получить предыдущие 5 сообщений:
Передадим на бэк id: 10, limit: 5
$limit = $request->input('limit');
$id = $request->input('id');
$dialogId = $request->input('dialog_id');
$messages = DB::table('dialog_messages')
->leftJoin('user_attributes', 'user_attributes.user_id', '=', 'dialog_messages.user_id')
>select('user_attributes.avatar', 'user_attributes.fullname', 'dialog_messages.replay', 'dialog_messages.created_at', 'user_attributes.user_id', 'dialog_messages.id')
->where('dialog_messages.dialog_id', '=', $dialogId)
->when($id, function ($query) {
$query->where('dialog_messages.id', '<', $id);
});
->orderByDesc('dialog_messages.id')
->limit($limit)
->get()
->reverse()
->values();