Laravel上一个和下一个记录

时间:2014-02-20 13:46:24

标签: php laravel routing laravel-4

我正在尝试创建一个页面,我可以在其中查看数据库中的所有人并对其进行编辑。我做了一个表格,我从某些字段的数据库填写数据。

我想通过“下一个”和“上一个”按钮浏览它们。

为了生成下一步,我必须使用大于当前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并增加当前ID的最佳方法是什么?

12 个答案:

答案 0 :(得分:65)

以下是您从@ 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>

答案 1 :(得分:24)

// 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();

答案 2 :(得分:1)

// 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();

答案 3 :(得分:0)

以下是我发现应该有所帮助的链接: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传递给视图。

答案 4 :(得分:0)

最简单的方法

// 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);
});

答案 5 :(得分:0)

我理解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);
    }

只有在您实际点击按钮时才会调用此功能。因此,只有在需要实际查找用户时才会进行数据库调用。

答案 6 :(得分:0)

如果您想要检索上一个/下一个记录及其数据, 你可以尝试

$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- with union我们现在只打一次db而不是3。

答案 7 :(得分:0)

首先,从数据库中获取一条记录。

    $post = Post::where('slug', $slug)->first();

对于数据库记录,我们可以获取前一个记录,该记录的ID小于ID按降序存储在$ post顺序中存储的ID,并使用first()返回单个记录。

    $previous = Post::where('id', '<', $post->id)->orderBy('id','desc')->first();

要获得下一条记录,它几乎是相同的查询,这一次获得的ID大于$ post中存储的ID的记录。

    $next = Post::where('id', '>', $post->id)->orderBy('id')->first();

答案 8 :(得分:0)

控制器:

DECLARE
l_selected APEX_APPLICATION_GLOBAL.VC_ARR2;
BEGIN
    l_selected := APEX_UTIL.STRING_TO_TABLE(:P500_EMPIDS);
    FOR i in 1 .. l_selected.count LOOP 
        UPDATE EMPLYEE SET EMPSTATUS = 'ACTIVE' WHERE EMPID = to_number(l_selected(i));
    END LOOP;
END;

答案 9 :(得分:0)

要获取下一篇和上一篇文章,我们可以在laravel中的 Model id 上使用maxmin函数。这是获得此示例 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

答案 10 :(得分:0)

在您的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);
}

答案 11 :(得分:-1)

我开发了代码。

它始终有效,即使我们没有任何下一个或上一个帖子

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;
}