Laravel предыдущие и следующие записи

Я пытаюсь создать страницу, где я могу видеть всех людей в моей базе данных и создавать для них изменения. Я сделал форму, где я заполняю данные из базы данных определенных полей.

Я хотел бы перейти через них через кнопку «Далее» и «Предыдущий».

Для создания следующего шага я должен взять идентификатор больше текущего, чтобы загрузить следующий профиль.

Для создания предыдущего шага я должен взять идентификатор, меньший, чем текущий, для загрузки предыдущего профиля.

Мой маршрут:

Route::get('users/{id}','UserController@show'); 

контроллер:

 public function show($id) { $input = User::find($id); // If a user clicks next this one should be executed. $input = User::where('id', '>', $id)->firstOrFail(); echo '<pre>'; dd($input); echo '</pre>'; return View::make('hello')->with('input', $input); } 

Вид: кнопки:

 <a href="{{ URL::to( 'users/' . $input->id ) }}">Next</a> 

Каков наилучший способ получить текущий идентификатор и увеличить его?

Ниже вы обновили контроллер и просмотрели файлы, полученные из ссылки @ ridecar2,

контроллер:

 public function show($id) { // get the current user $user = User::find($id); // get previous user id $previous = User::where('id', '<', $user->id)->max('id'); // get next user id $next = User::where('id', '>', $user->id)->min('id'); return View::make('users.show')->with('previous', $previous)->with('next', $next); } 

Посмотреть:

 <a href="{{ URL::to( 'users/' . $previous ) }}">Previous</a> <a href="{{ URL::to( 'users/' . $next ) }}">Next</a> 
 // in your model file public function next(){ // get next user return User::where('id', '>', $this->id)->orderBy('id','asc')->first(); } public function previous(){ // get previous user return User::where('id', '<', $this->id)->orderBy('id','desc')->first(); } // in your controller file $user = User::find(5); // a clean object that can be used anywhere $user->next(); $user->previous(); 

Вот ссылка, которую я нашел, которая должна помочь: http://maxoffsky.com/code-blog/laravel-quick-tip-get-previous-next-records/

Похоже, что для следующего вы хотите использовать: $next = User::where('id', '>', $id)->min('id'); и иметь представление как: <a href="{{ URL::to( 'users/' . $next->id ) }}">Next</a>

Также не забудьте передать $next с представлением.

Самый простой подход

 // User.php public static function findNext($id) { return static::where('id', '>', $id)->first(); } // UserController.php $nextUser = User::findNext($id); // view <a href="{{ URL::to( 'users/' . $nextUser->id ) }}">Next</a> 

Ленивый подход:

 // view <a href="{{ URL::to( 'users/' . $input->id . '/next') }}">Next</a> // routes.php (should be optimized, this is just to show the idea) Route::get('users/{user}/next', function($id) { $nextUser = User::findNext($id); return Redirect::to('user/' . $id); }); 

Я разработал код.

он работает все время, даже если у нас нет следующего или предыдущего сообщения

 public function nextPost($table, $id) { $next = DB::table($table)->where('id', '>', $id)->orderBy('id','asc')->first(); if(!$next) $next = DB::table($table)->orderBy('id','asc')->first(); return $next; } public function prevPost($table, $id) { $prev = DB::table($table)->where('id', '<', $id)->orderBy('id','desc')->first(); if(!$prev) $prev = DB::table($table)->orderBy('id','desc')->first(); return $prev; } 

Я понимаю, что подход, который делается здесь пользователем2581096, но я не уверен, что он эффективен (по любым стандартам). Мы вызываем базу данных 3 раза по-настоящему без уважительной причины. Я предлагаю альтернативу, которая будет более эффективной и масштабируемой.

Не пропускайте предыдущий и следующий идентификаторы в представление. Это устраняет 2 ненужных обращения к базе данных.

Создайте следующие маршруты:

пользователей / {ID} / следующий

пользователей / {ID} / предыдущий

Эти маршруты должны использоваться в атрибутах href привязных тегов

Добавьте методы в контроллер, чтобы обрабатывать каждый новый маршрут, который вы создали. Например:

  public function getPrevious(){ // get previous user $user = User::where('id', '<', $this->id)->orderBy('id','desc')->first(); return $this->show($user->id); } 

Эта функция вызывается только при нажатии кнопки. Поэтому вызов базы данных выполняется только тогда, когда вам нужно действительно искать пользователя.

в случае, если вы хотите получить предыдущие / следующие записи вместе со своими данными, вы можете попробовать

 $id = 7; // for example $prev = DB::table('posts')->where('id', '<', $id)->orderBy('id','desc')->limit(1); $next = DB::table('posts')->where('id', '>', $id)->limit(1); $res = DB::table('posts') ->where('id', '=', $id) ->unionAll($prev) ->unionAll($next) ->get(); // now $res is an array of 3 objects // main, prev, next dd($res); 

1- построитель запросов обычно намного быстрее, чем красноречивый .

2- с объединением мы теперь только нажимаем db один раз вместо 3.