Ich möchte die zuletzt in meine Tabelle eingefügte Datei abrufen. Ich weiß, dass die Methode first()
existiert und liefert Ihnen die erste Datei in der Tabelle, aber ich weiß nicht, wie Sie die letzte Einfügung erhalten.
Ich möchte die zuletzt in meine Tabelle eingefügte Datei abrufen. Ich weiß, dass die Methode first()
existiert und liefert Ihnen die erste Datei in der Tabelle, aber ich weiß nicht, wie Sie die letzte Einfügung erhalten.
Antworten:
Sie müssen nach demselben Feld bestellen, das Sie gerade bestellen, aber absteigend. Wenn Sie beispielsweise einen Zeitstempel haben, als der Upload aufgerufen wurde upload_time
, würden Sie so etwas tun.
Für Pre-Laravel 4
return DB::table('files')->order_by('upload_time', 'desc')->first();
Ab Laravel 4
return DB::table('files')->orderBy('upload_time', 'desc')->first();
Ab Laravel 5.7
return DB::table('files')->latest('upload_time')->first();
Dadurch werden die Zeilen in der Dateitabelle nach Upload-Zeit, absteigender Reihenfolge und der ersten sortiert . Dies ist die zuletzt hochgeladene Datei.
orderBy
nicht seinorder_by
User::orderby('created_at', 'desc')->first();
orderBy('created_at', 'desc')
Files::orderBy(id', 'desc')->first();
Reihenfolge nach Datum funktioniert länger, da das Datum eine Zeichenfolge ist und höchstwahrscheinlich nicht indiziert ist. Während der Primärschlüssel indiziert ist und superschnell funktioniert. Selbst wenn created_at indiziert ist, handelt es sich um eine indizierte Zeichenfolge und im Falle einer primären nicht um INT. Indexzeichenfolge hat weniger Leistung.
orderBy('created_at', 'desc')
nicht die letzte Zeile erhalten. Beispiel: 3 Zeilen können genau den gleichen TIMESTAMP-Wert haben und mit orderBy('created_at', 'desc')
Ihnen erhalten Sie die erste der 3 (was nicht unbedingt die letzte Zeile ist)
Verwenden Sie das neueste von Laravel bereitgestellte Zielfernrohr.
Model::latest()->first();
Auf diese Weise rufen Sie nicht alle Datensätze ab. Eine schönere Abkürzung zu orderBy.
created_at
Spalte ($timestamps = true)
im Modell verwendet, aber auf Wunsch deaktiviert werden kann, so dass Sie einen Fehler haben würden, wenn nicht definiert
Sie haben nie erwähnt, ob Sie Eloquent, Laravels Standard-ORM, verwenden oder nicht. Nehmen wir an, Sie möchten den neuesten Eintrag einer Benutzertabelle von created_at erhalten. Sie könnten wahrscheinlich Folgendes tun:
User::orderBy('created_at', 'desc')->first();
Zuerst werden die Benutzer absteigend nach dem Feld created_at sortiert, und dann wird der erste Datensatz des Ergebnisses erstellt.
Dadurch erhalten Sie eine Instanz des Benutzerobjekts und keine Sammlung. Um diese Alternative nutzen zu können, benötigen Sie natürlich ein Benutzermodell, das die Eloquent-Klasse erweitert. Das mag etwas verwirrend klingen, aber es ist sehr einfach, loszulegen, und ORM kann sehr hilfreich sein.
Weitere Informationen finden Sie in der offiziellen Dokumentation, die ziemlich umfangreich und detailliert ist.
Details zum letzten Datensatz abrufen
Model::all()->last();
oderModel::orderBy('id', 'desc')->first();
Um die letzte Datensatz-ID zu erhalten
Model::all()->last()->id;
oder Model::orderBy('id', 'desc')->first()->id;
Laravel Sammlungen hat Methode zuletzt
Model::all() -> last(); // last element
Model::all() -> last() -> pluck('name'); // extract value from name field.
Dies ist der beste Weg, dies zu tun.
all()
Methode tatsächlich alle Elemente lädt. Dies funktioniert nicht auf einer Tabelle mit Millionen von Datensätzen.
last()
eine einzelne eloquente Instanz und keine Sammlung pluck()
Model::all()->pluck('name')
name
Versuche dies :
Model::latest()->get();
Sie können den neuesten von Laravel bereitgestellten Bereich für das Feld verwenden, das Sie filtern möchten. Nehmen wir an, es wird nach ID sortiert und dann:
Model::latest('id')->first();
Auf diese Weise können Sie eine Bestellung nach vermeiden created_at
bei Laravel standardmäßig Feldern zu .
Verwenden Sie den folgenden Code, um die letzten Datensatzdetails abzurufen:
Model::where('field', 'value')->get()->last()
Eine andere ausgefallene Möglichkeit, dies in Laravel 6.x zu tun (unsicher, muss aber auch für 5.x funktionieren):
DB::table('your_table')->get()->last();
Sie können auch auf Felder zugreifen:
DB::table('your_table')->get()->last()->id;
get()
Methode ruft alles ab your_table
und generiert eine Sammlung. Die last()
Methode ruft das letzte Element aus dieser Sammlung ab. Sie haben also bereits alle Daten aus der Tabelle in Ihrem Speicher geladen (fehlerhaft). Sie sollten einfach "DB :: table (" items ") -> latest () -> first ();" hinter den Kulissen "orderBy ($ column," desc ")" ausführen und den ersten Datensatz abrufen.
Wenn Sie nach der tatsächlichen Zeile suchen, die Sie gerade mit Laravel 3 und 4 eingefügt haben, wenn Sie eine save
oder eine create
Aktion für ein neues Modell ausführen, wie z.
$user->save();
-oder-
$user = User::create(array('email' => 'example@gmail.com'));
Anschließend wird die eingefügte Modellinstanz zurückgegeben und kann für weitere Aktionen verwendet werden, z. B. zum Umleiten auf die Profilseite des gerade erstellten Benutzers.
Das Suchen nach dem zuletzt eingefügten Datensatz funktioniert auf einem System mit geringer Lautstärke fast immer. Wenn Sie jedoch gleichzeitig Einfügungen vornehmen müssen, können Sie am Ende nachfragen, um den falschen Datensatz zu finden. Dies kann in einem Transaktionssystem, in dem mehrere Tabellen aktualisiert werden müssen, zu einem echten Problem werden.
beachten Sie, dass last()
, latest()
nicht deterministisch sind , wenn Sie für eine sequentielle oder Ereignis / geordneten Datensatz suchen. Die letzten / letzten Datensätze können genau den gleichen created_at
Zeitstempel haben, und der, den Sie zurückerhalten, ist nicht deterministisch. Also mach es orderBy(id|foo)->first()
. Andere Ideen / Vorschläge, wie man deterministisch sein kann, sind willkommen.