Saya ingin mengambil file terakhir yang dimasukkan ke meja saya. Saya tahu bahwa metode ini first()
ada dan memberi Anda file pertama dalam tabel, tetapi saya tidak tahu cara mendapatkan sisipan terakhir.
Saya ingin mengambil file terakhir yang dimasukkan ke meja saya. Saya tahu bahwa metode ini first()
ada dan memberi Anda file pertama dalam tabel, tetapi saya tidak tahu cara mendapatkan sisipan terakhir.
Jawaban:
Anda harus memesan dengan bidang yang sama dengan yang Anda pesan sekarang, tetapi turun. Sebagai contoh, jika Anda memiliki cap waktu ketika unggahan selesai dipanggil upload_time
, Anda akan melakukan sesuatu seperti ini;
Untuk Pra-Laravel 4
return DB::table('files')->order_by('upload_time', 'desc')->first();
Untuk Laravel 4 dan seterusnya
return DB::table('files')->orderBy('upload_time', 'desc')->first();
Untuk Laravel 5.7 dan seterusnya
return DB::table('files')->latest('upload_time')->first();
Ini akan memesan baris dalam tabel file dengan mengunggah waktu, menurun urutan , dan mengambil yang pertama. Ini akan menjadi file yang diunggah terbaru.
orderBy
, bukanorder_by
User::orderby('created_at', 'desc')->first();
orderBy('created_at', 'desc')
Files::orderBy(id', 'desc')->first();
Urutan menurut tanggal berfungsi lebih lama karena tanggal adalah string dan kemungkinan besar tidak diindeks. Sementara primary key diindeks dan berfungsi super cepat. Bahkan jika create_at diindeks, itu diindeks string dan bukan INT dalam kasus primer. String indeks memiliki kinerja lebih sedikit.
orderBy('created_at', 'desc')
tidak memberi Anda baris terakhir. Contoh: 3 baris dapat memiliki nilai TIMESTAMP yang persis sama dan orderBy('created_at', 'desc')
Anda akan mendapatkan yang pertama dari 3 (yang belum tentu merupakan baris terakhir)
Gunakan ruang lingkup terbaru yang disediakan oleh Laravel di luar kotak.
Model::latest()->first();
Dengan begitu Anda tidak mengambil semua catatan. Pintasan yang lebih baik untuk memesan oleh.
created_at
kolom yang dibuat secara otomatis ($timestamps = true)
dalam Model, tetapi dapat dinonaktifkan sesuai keinginan sehingga Anda akan memiliki kesalahan jika tidak terdefinisi
Anda tidak pernah menyebutkan apakah Anda menggunakan Eloquent, ORM default Laravel atau tidak. Jika ya, misalkan Anda ingin mendapatkan entri terbaru dari tabel Pengguna, dengan create_at, Anda mungkin bisa melakukan hal berikut:
User::orderBy('created_at', 'desc')->first();
Pertama memerintahkan pengguna dengan bidang create_at, turun, dan kemudian mengambil catatan pertama dari hasilnya.
Itu akan mengembalikan Anda sebuah instance dari objek Pengguna, bukan koleksi. Tentu saja, untuk menggunakan alternatif ini, Anda harus memiliki model Pengguna, memperluas kelas Eloquent. Ini mungkin terdengar agak membingungkan, tetapi sangat mudah untuk memulai dan ORM bisa sangat membantu.
Untuk informasi lebih lanjut, lihat dokumentasi resmi yang cukup kaya dan terperinci dengan baik.
Untuk mendapatkan detail catatan terakhir
Model::all()->last();
atauModel::orderBy('id', 'desc')->first();
Untuk mendapatkan id rekaman terakhir
Model::all()->last()->id;
atau Model::orderBy('id', 'desc')->first()->id;
Koleksi Laravel memiliki metode terakhir
Model::all() -> last(); // last element
Model::all() -> last() -> pluck('name'); // extract value from name field.
Ini adalah cara terbaik untuk melakukannya.
all()
metode ini benar-benar memuat semua item. Ini tidak akan berfungsi di atas meja dengan jutaan catatan.
last()
mengembalikan satu instance Eloquent dan bukan Collection, dan pemanggilan pluck()
yang sama dengan pemanggilan Model::all()->pluck('name')
, oleh karena itu mengembalikan name
atribut dari semua baris dalam tabel
Coba ini :
Model::latest()->get();
Anda dapat menggunakan ruang lingkup terbaru yang disediakan oleh Laravel dengan bidang yang ingin Anda filter, katakanlah itu akan dipesan oleh ID, lalu:
Model::latest('id')->first();
Jadi dengan cara ini, Anda dapat menghindari memesan berdasarkan created_at
bidang secara default di Laravel.
Untuk mendapatkan detail catatan terakhir, gunakan kode di bawah ini:
Model::where('field', 'value')->get()->last()
Cara mewah lain untuk melakukannya di Laravel 6.x (Tidak yakin tetapi harus bekerja untuk 5.x juga):
DB::table('your_table')->get()->last();
Anda juga dapat mengakses bidang:
DB::table('your_table')->get()->last()->id;
get()
metode akan mengambil semuanya dari your_table
dan menghasilkan Koleksi dan last()
metode akan mendapatkan item terakhir dari koleksi itu. Jadi Anda sudah memiliki semua data dari tabel yang dimuat di memori Anda (buruk). Anda cukup menggunakan `DB :: table ('items') -> latest () -> first ();` di belakang layar ia menjalankan `orderBy ($ kolom, 'desc')` dan ambil catatan pertama.
Jika Anda mencari baris aktual yang baru saja Anda masukkan dengan Laravel 3 dan 4 ketika Anda melakukan save
atau melakukan create
tindakan pada model baru seperti:
$user->save();
-atau-
$user = User::create(array('email' => 'example@gmail.com'));
maka instance model yang dimasukkan akan dikembalikan dan dapat digunakan untuk tindakan lebih lanjut seperti mengarahkan ulang ke halaman profil pengguna yang baru saja dibuat.
Mencari catatan yang disisipkan terakhir berfungsi pada sistem volume rendah akan berfungsi hampir sepanjang waktu, tetapi jika Anda harus memasukkan masuk pada saat yang sama, Anda dapat berakhir meminta untuk menemukan catatan yang salah. Ini benar-benar dapat menjadi masalah dalam sistem transaksional di mana beberapa tabel perlu diperbarui.
Entah bagaimana semua hal di atas sepertinya tidak bekerja untuk saya di laravel 5.3, jadi saya memecahkan masalah saya sendiri menggunakan:
Model::where('user_id', '=', $user_id)->orderBy('created_at', 'desc')->get();
berharap bisa menyelamatkan seseorang.
Perlu diketahui bahwa last()
, latest()
tidak deterministik jika Anda mencari catatan berurutan atau peristiwa / dipesan. Catatan terakhir / terakhir dapat memiliki created_at
stempel waktu yang sama persis , dan yang Anda dapatkan kembali tidak deterministik. Begitu juga orderBy(id|foo)->first()
. Gagasan / saran lain tentang bagaimana menjadi deterministik dapat diterima.