it-swarm.com.de

Laravel vorherige und nächste Datensätze

Ich versuche, eine Seite zu erstellen, auf der ich alle Personen in meiner Datenbank sehen und Änderungen daran vornehmen kann. Ich habe ein Formular erstellt, in dem ich die Daten aus der Datenbank bestimmter Felder ausfülle. 

Ich möchte durch die Schaltflächen Weiter und Zurück navigieren. 

Um den nächsten Schritt zu generieren, muss ich die ID größer als die aktuelle nehmen, um das nächste Profil zu laden. 

Um den vorherigen Schritt zu erzeugen, muss ich die ID kleiner als die aktuelle nehmen, um das vorherige Profil zu laden.

Meine Route:

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

Ansicht: Die Schaltflächen: 

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

Was ist der beste Ansatz, um die aktuelle ID abzurufen und zu erhöhen? 

19
Duikboot

Unten finden Sie Ihren aktualisierten Controller und die von @ ridecar2-Link abgeleiteten Dateien. 

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

Aussicht:

<a href="{{ URL::to( 'users/' . $previous ) }}">Previous</a>
<a href="{{ URL::to( 'users/' . $next ) }}">Next</a>
60
user2581096
// 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();
23

Ich verstehe den Ansatz, den user2581096 hier verfolgt, aber ich bin nicht sicher, ob er effizient ist. Wir rufen die Datenbank dreimal aus wirklich keinem guten Grund an. Ich empfehle eine Alternative, die wesentlich effizienter und skalierbarer ist.

Übergeben Sie nicht die vorherigen und nächsten IDs an die Ansicht. Dadurch entfallen 2 unnötige Datenbankaufrufe.

Erstellen Sie die folgenden Routen:

benutzer/{id}/next

benutzer/{ID}/Vorherige

Diese Routen sollten in den href-Attributen der Ankertags verwendet werden

Fügen Sie im Controller Methoden hinzu, um jede der neu erstellten Routen zu behandeln. Zum Beispiel:

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

Diese Funktion wird nur aufgerufen, wenn Sie tatsächlich auf die Schaltfläche klicken. Daher wird der Datenbankaufruf nur dann ausgeführt, wenn Sie den Benutzer tatsächlich suchen müssen.

0
Nikhil Agarwal

Ich habe eine einfachere Lösung für den vorherigen und den nächsten Benutzer gefunden:

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

0
sadiq

Hier ist ein Link, der mir helfen sollte: http://maxoffsky.com/code-blog/laravel-quick-tip-get-previous-next-records/

Es sieht so aus, als würden Sie Folgendes verwenden: $next = User::where('id', '>', $id)->min('id'); und haben die Ansicht als: <a href="{{ URL::to( 'users/' . $next->id ) }}">Next</a>

Vergessen Sie auch nicht, $next an die Ansicht zu übergeben.

0
ridecar2

Einfachste Annäherung

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

Fauler Ansatz:

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

falls Sie die vorherigen/nächsten Datensätze zusammen mit ihren Daten abrufen möchten, können Sie versuchen

$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- Der Query Builder ist normalerweise viel schneller als eloquent .

2- mit union treffen wir jetzt nur noch einmal die db statt 3.

0
ctf0

ich habe den Code entwickelt.

es funktioniert immer, auch wenn wir keinen nächsten oder vorherigen Beitrag haben

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
mostafaznv