【问题标题】:Laravel previous and next recordsLaravel 上一个和下一个记录
【发布时间】:2014-03-21 12:11:48
【问题描述】:

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

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

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

【问题讨论】:

  • 很遗憾,我无法回答这个问题(尽管我可能也会使用您的方法,然后想知道是否有更好的方法),但我认为 firstOrFail 最终可能会成为问题:当用户查看最后一个模型,而不是能够看到它时,他们得到一个 404 页面,只是因为没有“下一个”模型可用。

标签: php laravel routing laravel-4


【解决方案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>

【讨论】:

  • 我根据您的版本制作了一个新版本,谢谢!我仍然有一些问题我在这里提供了 sn-p:laravel.io/bin/WWxL
  • @Duikboot:您将$input 变量传递给视图,而不是$previous$next 变量,在User::find() 中,find 需要小写.交叉验证代码here
  • 干净简单。谢谢!
  • 这太好了,谢谢!
  • 谢谢大佬,太好了
【解决方案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();

【讨论】:

  • 你的下一个函数实际上是前一个,而你上一个函数实际上是下一个;)
  • 超棒的人民!!
  • 谢谢!如果我们使用 slug 而不是 id,那是最好的方法 :)
  • 这只有在我们使用orderBy和id时才有效,如果我们orderBy与其他列然后?
  • @SagarNaliyapara 你需要一个有效的 id 才能进行排序!
【解决方案3】:

在你的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', $user->previous)
    ->with('next', $user->next);
}

【讨论】:

    【解决方案4】:

    我了解 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 的视图中显示 prev & next 记录怎么办?如果我们需要 prev 和 next 作为简单的分页 btns,您当前的方法就可以工作
    【解决方案5】:
    // 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();
    

    【讨论】:

    • 如果我们删除了前一个或下一个 id 怎么办?我认为其他答案比这更好
    • 这仅在没有从该表中删除任何行的情况下才有效。否则它不会按预期工作。
    【解决方案6】:

    要获取下一篇和上一篇文章,我们可以在 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
    

    【讨论】:

      【解决方案7】:

      这是我发现的一个应该有帮助的链接:http://maxoffsky.com/code-blog/laravel-quick-tip-get-previous-next-records/

      它看起来像你想使用的下一个:$next = User::where('id', '&gt;', $id)-&gt;min('id');,并且视图为:&lt;a href="{{ URL::to( 'users/' . $next-&gt;id ) }}"&gt;Next&lt;/a&gt;

      也不要忘记将$next 传递给视图。

      【讨论】:

        【解决方案8】:

        最简单的方法

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

        【讨论】:

          【解决方案9】:

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

          $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- 使用联合我们现在只访问数据库一次而不是 3。

          【讨论】:

            【解决方案10】:

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

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

            【讨论】:

              【解决方案11】:

              控制器:

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

              【讨论】:

                【解决方案12】:

                我开发了代码。

                它一直有效,即使我们没有任何下一篇或上一篇文章

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

                【讨论】:

                • 这是一个不好的例子。如果没有结果,则只返回一个结果。用户会认为剩下的item比较多,其实不然。
                猜你喜欢
                • 1970-01-01
                • 2011-07-24
                • 2015-04-24
                • 2021-11-25
                • 1970-01-01
                • 2013-07-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多