簡體   English   中英

Laravel 上一個和下一個記錄

[英]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上使用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

這是我發現應該有幫助的鏈接: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM