Tablodaki Son Satırı Seç


163

Tabloma eklenen son dosyayı almak istiyorum. Yöntemin first()var olduğunu ve tablodaki ilk dosyayı sağladığını biliyorum ama son eklemeyi nasıl alacağımı bilmiyorum.


Ayrıca bkz. Stackoverflow.com/questions/33321447/… Mevcut bir ilişki nasıl sıralanır (hasMany)
Tarek Adam

Bu Laravel hakkında soru soran ve cevaplayan herkes içindir. Hangi Laravel sürümünden bahsettiğinizi belirtmenin önemli olduğunu unutmayın. Genellikle sürüm 4 ve 5'in farklılıkları ve eski sürümleri de vardır.
Heroselohim

Yanıtlar:


224

Şimdiye kadar sipariş ettiğiniz aynı alana göre sipariş vermeniz gerekiyor, ancak azalan. Örnek olarak, yükleme tamamlandığında bir zaman damganız varsa, upload_timeböyle bir şey yaparsınız;

Laravel Öncesi 4 için

return DB::table('files')->order_by('upload_time', 'desc')->first();

Laravel 4 ve sonrası için

return DB::table('files')->orderBy('upload_time', 'desc')->first();

Laravel 5.7 ve sonrası için

return DB::table('files')->latest('upload_time')->first();

Bu, dosyalar tablosundaki satırları yükleme süresine, azalan sıraya göre sıralar ve birincisini alır. Bu en son yüklenen dosya olacak.


15
Laravel 4 için bu olmamalı orderBy, değilorder_by
Jared Eitnier

9
ORM'yi kullandığınızda, bu doğru bir yoldur:User::orderby('created_at', 'desc')->first();
Cas Bloem

1
Laravel 5.x =orderBy('created_at', 'desc')
0x1ad2

9
Neden create_at sütununu kullanıyorsunuz? Birincil anahtar kimliğini kullanmak çok daha hızlı. Laravel 5.x Files::orderBy(id', 'desc')->first();Tarihe göre sıralama, tarih dize olduğundan ve büyük olasılıkla dizine eklenmediğinden daha uzun süre çalışır. Birincil anahtar endekslenir ve süper hızlı çalışır. Oluşturulan_at dizine alınmış olsa bile, birincil durumunda INT değil dizine eklenir. Dizin dizesi daha az performansa sahiptir.
KorbenDallas

4
@KorbenDallas yorumu cevap olmalıdır, çünkü bazen orderBy('created_at', 'desc')size son satırı vermez. Örnek: 3 satır tam olarak aynı TIMESTAMP değerine sahip olabilir ve orderBy('created_at', 'desc')sizinle 3'ün ilkini alırsınız (son satır olması gerekmez)
viery365

111

Kutudan çıkan Laravel tarafından sağlanan en son kapsamı kullanın.

Model::latest()->first();

Bu şekilde tüm kayıtları almazsınız. OrderBy için daha hoş bir kısayol.


7
Bu yöntemin Modelde otomatik oluşturulan created_atsütunu kullandığını ($timestamps = true), ancak tanımsızsa bir hataya sahip olmanızı dilediğiniz zaman devre dışı
bırakabileceğinizi unutmayın

Laravel 5.7 kullanıyorum ve bir Model üzerinde yapmaya çalışıyorum hala benim için tüm kayıtları alır.
CJ Dennis

1
Aynı saniye içinde birden çok kayıt eklediyseniz, oluşturulan_at süresinin bu kayıtlar için aynı olacağını ve bu nedenle latest () tarafından döndürülen kaydın olmasını beklediğiniz kayıt olmayabileceğini unutmayın.
F3CP

Bir "created_at" sütununa ihtiyacınız olmadığını unutmayın. En son hangi sütundan istediğinizi belirleyebilirsiniz. Örneğin: Model :: latest ('dateColumn') -> ilk ();
Tom

Bu, 1 saniye içinde iki satır eklenirse gerçek son satırı alamayabilir (aslında birim testinde sorunlara neden olmuştur).
biber

75

Laravel'in varsayılan ORM'sini Eloquent kullanıp kullanmadığınızı hiç söylemediniz. Olmanız durumunda, bir User tablosunun en son girişini create_at ile almak istediğinizi varsayalım, muhtemelen aşağıdaki gibi yapabilirsiniz:

User::orderBy('created_at', 'desc')->first();

İlk olarak, kullanıcıları azalan şekilde create_at alanına göre sıralar ve ardından sonucun ilk kaydını alır.

Bu size bir koleksiyon değil, User nesnesinin bir örneğini döndürür. Tabii ki, bu alternatiften yararlanmak için Eloquent sınıfını genişleten bir Kullanıcı modeline sahip olmalısınız. Bu biraz kafa karıştırıcı gelebilir, ancak başlamak gerçekten kolaydır ve ORM gerçekten yardımcı olabilir.

Daha fazla bilgi için oldukça zengin ve ayrıntılı resmi belgelere göz atın.


42

Son kayıt ayrıntılarını almak için

  1. Model::all()->last(); veya
  2. Model::orderBy('id', 'desc')->first();

Son kayıt kimliğini almak için

  1. Model::all()->last()->id; veya
  2. Model::orderBy('id', 'desc')->first()->id;

14

Laravel koleksiyonlarında son yöntem var

Model::all() -> last(); // last element 
Model::all() -> last() -> pluck('name'); // extract value from name field. 

Bunu yapmanın en iyi yolu budur.


16
Sadece all()yöntemin aslında tüm öğeleri yüklediğini belirtmek istedim . Bu, milyonlarca kaydı olan bir tabloda çalışmaz.
Steven Jeffries

1
Steven Jeffries yorumuna ek olarak, çağrının last()bir Koleksiyon değil tek bir Eloquent örneği döndürdüğünü ve bunun çağrılmaya pluck()eşit olduğunu Model::all()->pluck('name'), dolayısıyla tablodaki tüm satırların nameniteliğini
döndürdüğünü belirtmek isterim

5
Bu yöntem aslında daha kötü. DB düzeyinde yapmak yerine PHP yürütme kullanarak son ham getiriliyor. Tabloda milyonlarca çiğ varsa, ne kadar verimsiz olabileceğini biliyor musunuz?
Bhaskar Dabhi

Bunu yapmanın en iyi yolu budur. - Hayır! Asla olmadı, asla olmayacak. Yalnızca ihtiyacınız olan satır yerine tüm satırları yüklüyorsunuz .
René Roth

11

Bunu dene :

Model::latest()->get();

1
Bu, birden çok satır döndürür. Tek bir sıraya ihtiyacı var. first () ona orderBy () maddesi ile yardımcı olacaktır.
Tahir Afridi

Bu, 1 saniye içinde iki satır eklenirse gerçek son satırı alamayabilir (aslında birim testinde sorunlara neden olmuştur).
biber

1
@TahirAfridi'nin belirttiği gibi bu, tüm satırları belleğe yükleyeceğinden, büyük bir tabloda bu bellek dışı özel duruma neden olur.
Rihards

6

Laravel tarafından sağlanan en son kapsamı filtrelemek istediğiniz alanla kullanabilirsiniz, diyelim ki ID ile sipariş verilecek,

Model::latest('id')->first();

Böylece created_atLaravel'de varsayılan olarak alana göre sipariş vermekten kaçınabilirsiniz.


5

Son kayıt ayrıntılarını almak için aşağıdaki kodu kullanın:

Model::where('field', 'value')->get()->last()

Kullanma. Bu, son eklenen satıra doğrudan erişim sağlayan en son kapsam () olan çok kötü bir uygulamadır.
Çalışan Domuz

3

Laravel 6.x'te yapmanın başka bir fantezi yolu (Emin değilim, ancak 5.x için de çalışması gerekir):

DB::table('your_table')->get()->last();

Alanlara da erişebilirsiniz:

DB::table('your_table')->get()->last()->id;


Ayrıca Laravel 5.8'de benim için çalışıyor, sadece seninkini görmeden önce cevabı gönderdi
Dazzle

1
Laravel'in bunu sahnenin arkasında nasıl yaptığı ve bunun neden büyük veri kümesi için tehlikeli olduğu hakkında küçük bir açıklama, get()yöntem her şeyi alır your_tableve bir Koleksiyon oluşturur ve last()yöntem bu koleksiyondan son öğeyi alır. Böylece tablodaki tüm verileriniz belleğinizde yüklü olacaktır (kötü). Sadece `DB :: table ('items') -> latest () -> first ();` `sahnenin arkasında` orderBy ($ column, 'desc') `i kullanmalı ve ilk kaydı getirmelisiniz.
Anuj Shrestha


1

Laravel 3 ve 4 ile eklediğiniz asıl satırı arıyorsanız, aşağıdaki gibi yeni bir modelde saveveya createeylem gerçekleştirirken :

$user->save();

-veya-

$user = User::create(array('email' => 'example@gmail.com'));

eklenen model örneği döndürülür ve yeni oluşturulan kullanıcının profil sayfasına yönlendirme gibi başka işlemler için kullanılabilir.

Son eklenen kayıt için düşük hacimli sistem üzerinde çalışmak neredeyse her zaman işe yarayacak, ancak ekler eklemek zorunda kalırsanız aynı anda gitmek yanlış kayıt bulmak için sorgulama sona erebilir. Bu, birden çok tablonun güncellenmesi gereken bir işlem sisteminde gerçekten bir sorun haline gelebilir.


1

Her nasılsa yukarıdaki tüm laravel 5.3 benim için çalışmıyor gibi görünüyor, bu yüzden kullanarak kendi sorunumu çözdü:

Model::where('user_id', '=', $user_id)->orderBy('created_at', 'desc')->get();

umarım birini kurtarırım.


1

Kullanın Model::where('user_id', $user_id)->latest()->get()->first(); yalnızca bir kayıt döndürür, bulamazsa geri döner null. Umarım bu yardımcı olur.


0

Tablonun tarih alanı varsa, bu ( User::orderBy('created_at', 'desc')->first();) en iyi çözüm olduğunu düşünüyorum. Ama tarih alanı yok Model ::orderBy('id', 'desc')->first()->id;, en iyi çözüm, eminim.


0

unutmayın last(), latest()bir sıralı veya etkinlik / sipariş kayıt arıyorsanız deterministik değildir. Son / son kayıtlar tam olarak aynı created_atzaman damgasına sahip olabilir ve geri aldığınız deterministik değildir. Öyleyse yap orderBy(id|foo)->first(). Nasıl deterministik olacağına dair diğer fikir / önerilerinizi bekliyoruz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.