Laravel上一个和下一个记录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel上一个和下一个记录相关的知识,希望对你有一定的参考价值。
我正在尝试创建一个页面,我可以在其中查看数据库中的所有人并对其进行编辑。我做了一个表格,我从某些字段的数据库填写数据。
我想通过Next和Previous按钮浏览它们。
为了生成下一步,我必须使用大于当前ID的ID来加载下一个配置文件。
为了生成上一步,我必须将ID小于当前的ID以加载先前的配置文件。
我的路线:
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>
获取当前ID并增加它的最佳方法是什么?
以下是您从@ 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);
});
我理解user2581096采取的方法,但我不确定它是否有效(按任何标准)。我们正在调用数据库3次,实在没有充分的理由。我建议一种更有效和可扩展的替代方案。
不要将上一个和下一个ID传递给视图。这消除了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-查询构建器通常比eloquent快得多。
我们现在只用一次而不是3来击中数据库。
我开发了代码。
它总是有效,即使我们没有任何下一个或上一篇文章
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;
}
以上是关于Laravel上一个和下一个记录的主要内容,如果未能解决你的问题,请参考以下文章