Я использую Doctrine и пытаюсь реализовать бесконечную прокрутку для коллекции заметок, отображаемых в браузере пользователя.
Приложение очень динамичное, поэтому, когда пользователь отправляет новую заметку, она сразу же добавляется в начало коллекции, помимо отправки (и сохранения) на сервер.
Вот почему я не могу использовать традиционный метод разбивки на страницы, когда вы просто отправляете номер страницы на сервер, а сервер определяет смещение и количество результатов.
Чтобы дать вам пример того, что я имею в виду, представьте, что отображается 20 заметок, затем пользователь добавляет еще 2 заметки, поэтому отображается 22 заметки. Если я просто запрошу «страницу 2», первые 2 элемента этой страницы будут последними двумя элементами страницы, отображаемой в данный момент пользователю.
Вот почему я ищу более сложный метод, который я собираюсь объяснить.
Пожалуйста, рассмотрите следующий код, который является частью кода сервера, обслуживающего запрос AJAX для дополнительных заметок:
// $lastNoteDisplayedId is coming from the AJAX request
$lastNoteDisplayed = $repository->findBy($lastNoteDisplayedId);
$allNotes = $repository->findBy($filter, array('numberOfVotes' => 'desc'));
$offset = getLastNoteDisplayedOffset($allNotes, $lastNoteDisplayedId);
// retrieve the page to send back so that it can be appended to the listing
$notesPerPage = 30
$notes = $repository->findBy(
array(),
array('numberOfVotes' => 'desc'),
$notesPerPage,
$offset
);
$response = json_encode($notes);
return $response;
По сути, мне нужно было бы написать метод getLastNoteDisplayedOffset
, который, учитывая весь набор заметок и одну конкретную заметку, может дать мне свое смещение, чтобы я мог использовать его для разбиения на страницы предыдущего утверждения Doctrine.
Я знаю, что возможной реализацией будет:
getLastNoteDisplayedOffset($allNotes, $lastNoteDisplayedId) {
$i = 0;
foreach ($allNotes as $note) {
if ($note->getId() === $lastNoteDisplayedId->getId()) {
break;
}
$i++;
}
return $i;
}
Я бы предпочел не перебирать все заметки, потому что производительность является важным фактором. Мне интересно, есть ли у Doctrine метод или вы можете предложить другой подход.