我正在使用 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 本身是否有方法,或者您是否可以提出不同的方法。