CakePHP 3 poprzedni następny rekord

W CakePHP 2 była przydatna funkcja o nazwie "neighbors", w której można po prostu zażądać sąsiednich rekordów (poprzedniego i następnego). Nie ma tego w CakePHP 3, prawdopodobnie ze względu na ograniczone wykorzystanie takiej funkcji, jednak w przypadku niestandardowych wyszukiwaczy (finderów) można samemu zaimplementować tę funkcjonalność. W pliku src/Models/Table/UsersTable.php dodaj własną funkcję findera.

public function findNeighbors(Query $query, array $options)
{
    $id = $options['id'];
    $previous = $this->find()
            ->select('id')
            ->order(['id' => 'DESC'])
            ->where(['id <' => $id])
            ->first();
    $next = $this->find()
            ->select('id')
            ->order(['id' => 'ASC'])
            ->where(['id >' => $id])
            ->first();
    return ['prev' => $previous, 'next' => $next];
}
Potem można wywołać tę funkcję w kontrolerze.
public function view($id = null)
{
    $neighbors = $this->Users->find('neighbors', ['id' => $user->id]);
    $this->set(compact('user', 'neighbors'));
}
Pozostało już tylko użycie w widoku.
if ($neighbors['prev']['id']) {
	echo $this->Html->link('Prev', ['action' => 'view', $neighbors['prev']['id']], ['class' => 'button']);
}
if ($neighbors['next']['id']) {
	echo $this->Html->link('Next', ['action' => 'view', $neighbors['next']['id']], ['class' => 'button']);
}