J'essaie de créer une page sur laquelle je peux voir toutes les personnes de ma base de données et créer des modifications sur elles. J'ai créé un formulaire dans lequel je remplis les données de la base de données de certains champs.
Je voudrais naviguer à travers eux par un bouton Suivant et précédent.
Pour générer la prochaine étape, je dois prendre un ID plus grand que celui actuel pour charger le prochain profil.
Pour générer l’étape précédente, je dois prendre un ID plus petit que celui en cours pour charger le profil précédent.
Mon itinéraire:
Route::get('users/{id}','UserController@show');
Manette:
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);
}
Vue: Les boutons:
<a href="{{ URL::to( 'users/' . $input->id ) }}">Next</a>
Quelle est la meilleure approche pour obtenir l'ID actuel et l'incrémenter?
Vous trouverez ci-dessous votre contrôleur mis à jour et les fichiers dérivés dérivés du lien @ ridecar2.
Manette:
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);
}
Vue:
<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();
Je comprends l'approche adoptée par l'utilisateur2581096 mais je ne suis pas sûre que ce soit efficace (à tous points de vue). Nous appelons la base de données 3 fois pour vraiment aucune bonne raison. Je suggère une alternative qui sera beaucoup plus efficace et évolutive.
Ne transmettez pas les identifiants précédent et suivant à la vue. Ceci élimine 2 appels de base de données inutiles.
Créez les itinéraires suivants:
utilisateurs/{id}/next
utilisateurs/{id}/previous
Ces routes doivent être utilisées dans les attributs href des balises d'ancrage.
Ajoutez des méthodes dans le contrôleur pour gérer chacune des nouvelles routes que vous avez créées. Par exemple:
public function getPrevious(){
// get previous user
$user = User::where('id', '<', $this->id)->orderBy('id','desc')->first();
return $this->show($user->id);
}
Cette fonction ne sera appelée que lorsque vous cliquerez sur le bouton. Par conséquent, l'appel à la base de données n'est effectué que lorsque vous devez rechercher l'utilisateur.
J'ai trouvé une solution plus simple pour obtenir les utilisateurs précédents et suivants:
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);
}
Voici un lien que j'ai trouvé qui devrait aider: http://maxoffsky.com/code-blog/laravel-quick-tip-get-previous-next-records/
Cela ressemble à la prochaine que vous voulez utiliser: $next = User::where('id', '>', $id)->min('id');
et avoir la vue comme: <a href="{{ URL::to( 'users/' . $next->id ) }}">Next</a>
N'oubliez pas non plus de transmettre $next
à la vue.
Approche la plus simple
// 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>
Approche paresseuse:
// 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);
});
au cas où vous souhaiteriez récupérer les enregistrements précédents/suivants avec leurs données, vous pouvez essayer
$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- Le générateur de requêtes est généralement beaucoup plus rapide que eloquent.
2- Avec l'union, nous ne touchons qu'une fois la base de données au lieu de 3.
j'ai développé le code.
ça marche tout le temps, même si on n'a pas de message suivant ou précédent
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;
}