-
Notifications
You must be signed in to change notification settings - Fork 315
Open
Description
Currently, retrieving messages from a conversation uses offset-based pagination:
chat/src/Models/Conversation.php
Lines 310 to 343 in 8f03df6
/** | |
* Get messages in conversation for the specific participant. | |
* | |
* @param Model $participant | |
* @param $paginationParams | |
* @param $deleted | |
* | |
* @return LengthAwarePaginator|HasMany|Builder | |
*/ | |
private function getConversationMessages(Model $participant, $paginationParams, $deleted) | |
{ | |
$messages = $this->messages() | |
->join($this->tablePrefix.'message_notifications', $this->tablePrefix.'message_notifications.message_id', '=', $this->tablePrefix.'messages.id') | |
->where($this->tablePrefix.'message_notifications.messageable_type', $participant->getMorphClass()) | |
->where($this->tablePrefix.'message_notifications.messageable_id', $participant->getKey()); | |
$messages = $deleted ? $messages->whereNotNull($this->tablePrefix.'message_notifications.deleted_at') : $messages->whereNull($this->tablePrefix.'message_notifications.deleted_at'); | |
$messages = $messages->orderBy($this->tablePrefix.'messages.id', $paginationParams['sorting']) | |
->paginate( | |
$paginationParams['perPage'], | |
[ | |
$this->tablePrefix.'message_notifications.updated_at as read_at', | |
$this->tablePrefix.'message_notifications.deleted_at as deleted_at', | |
$this->tablePrefix.'message_notifications.messageable_id', | |
$this->tablePrefix.'message_notifications.id as notification_id', | |
$this->tablePrefix.'message_notifications.is_seen', | |
$this->tablePrefix.'message_notifications.is_sender', | |
$this->tablePrefix.'messages.*', | |
], | |
$paginationParams['pageName'], | |
$paginationParams['page'] | |
); | |
return $messages; | |
} |
However, this is not the appropriate method for a realtime chat application. If a message is sent between the time that a user loads the first and second pages of messages, the offset will point to one of the previously retrieved messages. This is exactly the problem that cursor-based pagination aims to solve, not to mention better performance.
I believe the solution is as simple as changing
chat/src/Models/Conversation.php
Line 327 in 8f03df6
->paginate( |
to
->cursorPaginate(
and removing redundant pagination parameters.AlexR1712 and HugoHeneault
Metadata
Metadata
Assignees
Labels
No labels