Laravel предыдущие и следующие записи
Я пытаюсь создать страницу, где я могу видеть всех людей в моей базе данных и создавать для них изменения. Я сделал форму, где я заполняю данные из базы данных определенных полей.
Я хотел бы перейти через них через кнопку Next и Previous.
Для создания следующего шага я должен взять идентификатор, превышающий текущий, для загрузки следующего профиля.
Для создания предыдущего шага мне нужно взять идентификатор меньше текущего, чтобы загрузить предыдущий профиль.
Мой маршрут:
Route::get('users/{id}','[email protected]');
Контроллер:
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>
Каков наилучший способ получить текущий идентификатор и увеличить его?
Ответы
Ответ 1
Ниже вы обновили контроллер и просмотрели файлы, полученные из ссылки @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>
Ответ 2
// 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();
Ответ 3
Я выяснил более простое решение для получения предыдущего и следующего пользователя:
public function show($id)
{
$previousUser = User::where('id', '<', $id)->first();
$nextUser = User::where('id', '>', $id)->first();
return View::make('users.show')->with('previous', $previousUser)->with('next', $nextUser);
}
Ответ 4
Здесь ссылка, которую я нашел, должна помочь: 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
в представление.
Ответ 5
Самый простой подход
// 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);
});
Ответ 6
Я разработал код.
он работает все время, даже если у нас нет следующего или предыдущего сообщения
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;
}
Ответ 7
Я понимаю, что подход, который делается здесь пользователем2581096, но я не уверен, что он эффективен (по любым стандартам). Мы вызываем базу данных 3 раза по-настоящему без уважительной причины. Я предлагаю альтернативу, которая будет более эффективной и масштабируемой.
Не передавать предыдущие и следующие идентификаторы в представление. Это устраняет 2 ненужных вызова базы данных.
Создайте следующие маршруты:
пользователей/{идентификатор}/следующий
пользователи/{ID}/предыдущий
Эти маршруты должны использоваться в атрибутах href якорных тегов
Добавьте методы в контроллер, чтобы обрабатывать каждый новый маршрут, который вы создали. Например:
public function getPrevious(){
// get previous user
$user = User::where('id', '<', $this->id)->orderBy('id','desc')->first();
return $this->show($user->id);
}
Эта функция вызывается только при нажатии кнопки. Поэтому вызов базы данных выполняется только тогда, когда вам нужно действительно искать пользователя.
Ответ 8
в случае, если вы хотите получить предыдущие/следующие записи вместе с их данными,
вы можете попробовать
$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- построитель запросов обычно намного быстрее eloquent.
2- с объединением, мы теперь только нажимаем db один раз вместо 3.