[英]Laravel previous and next records
我正在尝试创建一个页面,我可以在其中查看数据库中的所有人并对其进行编辑。 我制作了一个表格,在其中填写某些字段的数据库中的数据。
我想通过下一个和上一个按钮浏览它们。
为了生成下一步,我必须使用比当前更大的 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();
我理解 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);
}
只有当您实际单击按钮时才会调用此函数。 因此,数据库调用仅在您需要实际查找用户时进行。
// yourModel.php
public function previous()
{
return $this->find(--$this->id);
}
public function next()
{
return $this->find(++$this->id);
}
像魔术一样工作,你可以链接它:
$prevprev = Model::find($id)->previous()->previous();
$nextnext = Model::find($id)->next()->next();
为了获得下一篇和上一篇文章,我们可以在 laravel 中的Model id上使用max
和min
函数。 这是获取此https://usingphp.com/post/get-next-and-previous-post-link-in-laravel控制器的示例:
public function post($id)
{
$post = Post::find($id);
$previous = Post::where('id', '<', $post->id)->max('id');
$next = Post::where('id', '>', $post->id)->min('id');
return view( 'post', compact( 'post', 'next', 'previous' ));
}
风景:
@if($next)
<a href="{{ route( 'blog.show', $next->id ) }}">{{$next->title}}</a>
@endif
@if($previous)
<a href="{{ route( 'blog.show', $previous->id ) }}">{{$previous->title}}</a>
@endif
这是我发现应该有帮助的链接: http : //maxoffsky.com/code-blog/laravel-quick-tip-get-previous-next-records/
看起来您要使用$next = User::where('id', '>', $id)->min('id');
: $next = User::where('id', '>', $id)->min('id');
并有这样的观点: <a href="{{ URL::to( 'users/' . $next->id ) }}">Next</a>
也不要忘记在视图$next
传递$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);
});
如果您想检索上一条/下一条记录及其数据,您可以尝试
$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- 使用 union 我们现在只访问 db 一次而不是 3。
首先,从数据库中获取一条记录。
$post = Post::where('slug', $slug)->first();
使用数据库记录,我们可以通过 id 按降序获取记录 id 小于 $post order 中存储的 id 的前一条记录,并使用 first() 获取单个记录。
$previous = Post::where('id', '<', $post->id)->orderBy('id','desc')->first();
要获取下一条记录,它几乎是相同的查询,这次获取 id 大于 $post 中存储的 id 的记录。
$next = Post::where('id', '>', $post->id)->orderBy('id')->first();
控制器:
public function show($id)
{
// get the current user
$user = User::find($id);
// get previous user id
$previous = User::offset($user->id-2)->first();
// get next user id
$next = User::offset($user->id)->first();
return View::make('users.show')->with('previous', $previous)->with('next', $next);
}
在您的App\\Models\\User.php
...
protected $appends = ['next', 'previous'];
public function getNextAttribute()
{
return $this->where('id', '>', $this->id)->orderBy('id','asc')->first();
}
public function getPreviousAttribute()
{
return $this->where('id', '<', $this->id)->orderBy('id','asc')->first();
}
在您的控制器中,您可以简单地执行以下操作:
public function show(User $user)
{
return View::make('users.show')
->with('user', $user)
->with('previous', $previous)
->with('next', $next);
}
我开发了代码。
它始终有效,即使我们没有任何下一篇或上一篇文章
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.