Подгрузка старых записей и вывод в обратном порядке

Подскажите как сделать подгрузку сообщений, как в вк, при скроллинге вверх, добавляем предыдущие сообщения 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 шт):

Автор решения: IndianCoding

Нужно перевернуть полученную коллекцию.

->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();
→ Ссылка