Chciałbym odzyskać ostatni plik wstawiony do mojej tabeli. Wiem, że metoda first()
istnieje i udostępnia pierwszy plik w tabeli, ale nie wiem, jak uzyskać ostatnią wstawkę.
Chciałbym odzyskać ostatni plik wstawiony do mojej tabeli. Wiem, że metoda first()
istnieje i udostępnia pierwszy plik w tabeli, ale nie wiem, jak uzyskać ostatnią wstawkę.
Odpowiedzi:
Będziesz musiał zamawiać według tego samego pola, które składasz do tej pory, ale malejąco. Na przykład, jeśli masz sygnaturę czasową, kiedy wysyłanie zostało wywołane upload_time
, zrobiłbyś coś takiego;
Dla wersji Pre-Laravel 4
return DB::table('files')->order_by('upload_time', 'desc')->first();
Dla Laravel 4 i nowszych
return DB::table('files')->orderBy('upload_time', 'desc')->first();
Dla Laravel 5.7 i nowszych
return DB::table('files')->latest('upload_time')->first();
Spowoduje to uporządkowanie wierszy w tabeli plików według czasu przesyłania, kolejności malejącej i wybranie pierwszego. Będzie to najnowszy przesłany plik.
orderBy
, a nieorder_by
User::orderby('created_at', 'desc')->first();
orderBy('created_at', 'desc')
Files::orderBy(id', 'desc')->first();
Sortuj według daty działa dłużej, ponieważ data jest ciągiem i najprawdopodobniej nie jest indeksowana. Podczas gdy klucz podstawowy jest indeksowany i działa bardzo szybko. Nawet jeśli utworzony_at jest indeksowany, jest to indeksowany ciąg, a nie INT w przypadku podstawowego. Ciąg indeksu ma mniejszą wydajność.
orderBy('created_at', 'desc')
nie podaje ostatniego wiersza. Przykład: 3 wiersze mogą mieć dokładnie tę samą wartość TIMESTAMP, a wraz z orderBy('created_at', 'desc')
tobą otrzymasz pierwszy z 3 (który niekoniecznie jest ostatnim wierszem)
Użyj najnowszej lunety dostarczonej przez Laravel po wyjęciu z pudełka.
Model::latest()->first();
W ten sposób nie odzyskasz wszystkich rekordów. Ładniejszy skrót do zamawiania według.
created_at
kolumny ($timestamps = true)
w modelu, ale można ją wyłączyć na życzenie, aby wystąpił błąd, jeśli nie zostanie zdefiniowany
Nigdy nie wspomniałeś, czy używasz Eloquent, domyślnego ORM Laravela, czy nie. Jeśli tak, powiedzmy, że chcesz uzyskać najnowszy wpis w tabeli User, przez created_at, prawdopodobnie możesz wykonać następujące czynności:
User::orderBy('created_at', 'desc')->first();
Najpierw porządkuje użytkowników według pola created_at, malejąco, a następnie pobiera pierwszy rekord wyniku.
To zwróci instancję obiektu użytkownika, a nie kolekcję. Oczywiście, aby skorzystać z tej alternatywy, trzeba mieć model User, rozszerzający klasę Eloquent. Może się to wydawać nieco zagmatwane, ale bardzo łatwo jest zacząć, a ORM może być naprawdę pomocny.
Aby uzyskać więcej informacji, zapoznaj się z oficjalną dokumentacją, która jest dość bogata i szczegółowa.
Aby poznać szczegóły ostatniego rekordu
Model::all()->last();
lubModel::orderBy('id', 'desc')->first();
Aby uzyskać identyfikator ostatniego rekordu
Model::all()->last()->id;
lub Model::orderBy('id', 'desc')->first()->id;
Kolekcje Laravel mają metodę ostatnią
Model::all() -> last(); // last element
Model::all() -> last() -> pluck('name'); // extract value from name field.
To najlepszy sposób na zrobienie tego.
all()
metoda faktycznie ładuje wszystkie elementy. To nie zadziała w przypadku tabeli z milionami rekordów.
last()
zwraca pojedynczą instancję Eloquent, a nie Collection, a wywołanie pluck()
tego jest równoznaczne z wywołaniem Model::all()->pluck('name')
, a zatem zwróceniem name
atrybutu wszystkich wierszy w tabeli
Spróbuj tego :
Model::latest()->get();
Możesz użyć najnowszego zakresu dostarczonego przez Laravel z polem, które chcesz filtrować, powiedzmy, że zostanie uporządkowane według identyfikatora, a następnie:
Model::latest('id')->first();
W ten sposób możesz uniknąć zamawiania według created_at
pola domyślnie w Laravel.
Aby uzyskać szczegóły ostatniego rekordu, użyj poniższego kodu:
Model::where('field', 'value')->get()->last()
Kolejny fantazyjny sposób na zrobienie tego w Laravel 6.x (niepewny, ale musi działać również dla 5.x):
DB::table('your_table')->get()->last();
Możesz również uzyskać dostęp do pól:
DB::table('your_table')->get()->last()->id;
get()
metoda pobierze wszystko z your_table
i wygeneruje kolekcję, a last()
metoda uzyska ostatni element z tej kolekcji. Więc będziesz mieć już wszystkie dane z tabeli załadowane do twojej pamięci (źle). Powinieneś po prostu użyć `DB :: table ('items') -> latest () -> first ();` za sceną wykona polecenie `orderBy ($ column, 'desc')` i pobierz pierwszy rekord.
Jeśli szukasz rzeczywistego wiersza, który właśnie wstawiłeś za pomocą Laravel 3 i 4 podczas wykonywania akcji save
lub create
na nowym modelu, na przykład:
$user->save();
-lub-
$user = User::create(array('email' => 'example@gmail.com'));
następnie wstawiona instancja modelu zostanie zwrócona i może być użyta do dalszych działań, takich jak przekierowanie do strony profilu właśnie utworzonego użytkownika.
Wyszukiwanie ostatniego wstawionego rekordu działa na systemie o małej objętości, ale będzie działać prawie przez cały czas, ale jeśli kiedykolwiek będziesz musiał wstawiać wstawki w tym samym czasie, możesz zakończyć wyszukiwanie w celu znalezienia niewłaściwego rekordu. Może to naprawdę stać się problemem w systemie transakcyjnym, w którym wiele tabel wymaga aktualizacji.
W jakiś sposób wszystkie powyższe nie działają dla mnie w Laravel 5.3, więc rozwiązałem swój własny problem za pomocą:
Model::where('user_id', '=', $user_id)->orderBy('created_at', 'desc')->get();
mam nadzieję, że uda mi się kogoś wykupić.
należy pamiętać, że last()
, latest()
nie są deterministyczne, jeśli szukasz kolejnego lub zdarzenia / zamówionej rekordu. Ostatnie / ostatnie rekordy mogą mieć dokładnie tę samą created_at
sygnaturę czasową, a to, co otrzymujesz, nie jest deterministyczne. Więc zrób orderBy(id|foo)->first()
. Inne pomysły / sugestie, jak być deterministycznym, są mile widziane.