2014-02-20 88 views
10

我想創建一個頁面,我可以看到我的數據庫中的所有人,並在其上創建編輯。我做了一個表格,填寫某些領域的數據庫中的數據。Laravel上一個和下一個記錄

我想通過Next和Previous按鈕瀏覽它們。

爲了生成下一個步驟,我必須使用大於當前ID的ID來加載下一個配置文件。

爲了生成上一步,我必須使ID小於當前的ID來加載以前的配置文件。

我的路線:

Route::get('users/{id}','[email protected]'); 

控制器:

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,最好的辦法和增加它?

+0

不幸的是我不能回答這個問題(儘管我可能也會使用你的方法,然後想知道你是否有更好的方法),但我認爲'firstOrFail'可能最終成爲一個問題:當用戶得到查看最後一個模型,而不是t漢能夠看到它,他們得到一個404頁面,只是因爲沒有可用的'下一個'模型。 – alexrussell

回答

42

下面是更新後的控制器和視圖文件從@ 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> 
+0

我根據您的版本製作了新版本,謝謝!我仍然有一些問題可以在這裏找到: http://laravel.io/bin/WWxL – Duikboot

+1

@Duikboot:您正在將'$ input'變量傳遞給視圖,而不是'$ previous'或'$ next'變量和'User :: find()'中,** find **需要小寫。交叉驗證代碼[here](http://laravel.io/bin/rrq9)。 – 2014-02-21 04:05:16

+0

清潔和簡單。謝謝! – danboh

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); 
}); 
15
// 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(); 
+1

當你已經擁有' - > first()',你爲什麼要用' - > get()'? – sulaiman

+0

這是錯誤的,讓我改變這一點,謝謝 –

+0

你的下一個功能實際上是以前的,而你以前的功能其實是下一個;) – rafamds

0

我開發的代碼。

它的工作任何時候,即使我們沒有任何未來或分組後

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

我理解這裏的做法正在採取user2581096,但我不知道它是有效的(以任何標準衡量) 。我們打電話給數據庫3次真的沒有什麼好的理由。我建議一種更高效和可擴展的替代方案。

不要將前一個和下一個ID傳遞給視圖。這消除了2個不必要的數據庫調用。

創建以下路線:

用戶/(編號)/下一

用戶/ {ID} /先前

這些路線應在錨標籤的href屬性中使用

在控制器中添加方法來處理您創建的每條新路線。例如:

public function getPrevious(){ 
     // get previous user 
     $user = User::where('id', '<', $this->id)->orderBy('id','desc')->first(); 
     return $this->show($user->id); 
    } 

只有當您實際點擊按鈕時纔會調用此函數。因此,只有在需要實際查找用戶時纔會進行數據庫調用。

+0

這是一個很好的提示,但是如果您想在當前ID的視圖中顯示上一個和下一個記錄呢?如果我們需要prev&next作爲簡單的分頁btns,那麼你目前的方法工作 – ctf0

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的查詢生成器通常比雄辯快得多。

2 - 與工會,我們現在只打了一次分貝,而不是3

1

我已經找到了一個更簡單的解決方案,以獲得一個和下一個用戶:

public function show($id) 
 
{ 
 
    $previousUser = User::where('id', '<', $id)->first(); 
 
    $nextUser = User::where('id', '>', $id)->first(); 
 
    
 
    return View::make('users.show')->with('previous', $previousUser)->with('next', $nextUser); 
 
}

相關問題