Record precedenti e successivi di Laravel

Sto cercando di creare una pagina in cui posso vedere tutte le persone nel mio database e creare modifiche su di loro. Ho creato un module in cui inserisco i dati dal database di determinati campi.

Mi piacerebbe navigare attraverso di loro con un button Avanti e Indietro.

Per generare il prossimo passo devo prendere l'ID più grande di quello corrente per caricare il profilo successivo.

Per generare il passaggio precedente devo prendere l'ID più piccolo di quello corrente per caricare il profilo precedente.

Il mio path:

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

controller:

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

Visualizza: i pulsanti:

 <a href="{{ URL::to( 'users/' . $input->id ) }}">Next</a> 

Qual è l'approccio migliore per get l'ID corrente e incrementarlo?

Di seguito sono riportti i controller aggiornati e i file di visualizzazione derivati ​​dal collegamento @ ridecar2,

controller:

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

Vista:

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

Ecco un link che ho trovato che dovrebbe aiutare: http://maxoffsky.com/code-blog/laravel-quick-tip-get-previous-next-records/

Apparirà per il prossimo che si desidera utilizzare: $next = User::where('id', '>', $id)->min('id'); e vedere come: <a href="{{ URL::to( 'users/' . $next->id ) }}">Next</a>

Inoltre, non dimenticare di passare $next alla vista.

Approccio più semplice

 // 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> 

Approccio pigro:

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

ho sviluppato il codice.

funziona tutte le volte, anche se non abbiamo un post successivo o precedente

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

Capisco l'approccio che viene preso qui da user2581096 ma non sono sicuro che sia efficiente (da qualsiasi standard). Stiamo chiamando il database 3 volte per davvero nessuna buona ragione. Suggerisco un'alternativa che sarà molto più efficiente e scalabile.

Non passare gli ID precedenti e successivi alla vista. Ciò elimina 2 chiamate di database non necessarie.

Crea i seguenti routes:

utenti / {id} / successiva

utenti / {id} / precedente

Questi routes dovrebbero essere utilizzati negli attributi href dei tag di ancoraggio

Aggiungi methods nel controller per gestire ciascuno dei nuovi routes che hai creato. Per esempio:

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

Questa function verrà chiamata solo quando effettivamente fai clic sul button. Pertanto, la chiamata al database viene effettuata solo quando è necessario effettivamente cercare l'utente.

nel caso in cui si desidera recuperare i record prev / next insieme ai loro dati, si può provare

 $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 arrays of 3 objects // main, prev, next dd($res); 

1- il generatore di query è in genere molto più veloce di eloquente .

2- con l'unione ora stiamo colpendo il db una volta invece di 3.