Bagaimana saya bisa memilih baris acak menggunakan Eloquent atau Fluent in Laravel framework?
Saya tahu bahwa dengan menggunakan SQL, Anda dapat melakukan pemesanan dengan RAND (). Namun, saya ingin mendapatkan baris acak tanpa menghitung jumlah rekaman sebelum kueri awal.
Ada ide?
Jawaban:
Laravel> = 5.2:
atau
atau untuk mendapatkan jumlah catatan spesifik
Laravel 4.2.7 - 5.1:
Laravel 4.0 - 4.2.6:
Laravel 3:
Lihat artikel ini di baris acak MySQL. Laravel 5.2 mendukung ini, untuk versi yang lebih lama, tidak ada solusi yang lebih baik daripada menggunakan RAW Queries .
sunting 1: Seperti yang disebutkan oleh Double Gras, orderBy () tidak mengizinkan apa pun selain ASC atau DESC sejak perubahan ini . Saya memperbarui jawaban saya sesuai.
sunting 2: Laravel 5.2 akhirnya mengimplementasikan fungsi wrapper untuk ini. Ini disebut inRandomOrder () .
sumber
'RANDOM()'
Ini berfungsi dengan baik,
Anda juga dapat mengubah argumen dalam fungsi acak untuk mendapatkan lebih dari satu catatan.
Catatan: tidak disarankan jika Anda memiliki data besar karena ini akan mengambil semua baris terlebih dahulu dan kemudian mengembalikan nilai acak.
sumber
tl; dr: Saat ini diterapkan ke Laravel, lihat "sunting 3" di bawah.
Sayangnya, sampai hari ini ada beberapa peringatan dengan
->orderBy(DB::raw('RAND()'))
solusi yang diusulkan:RANDOM()
Lebih buruk lagi, solusi ini tidak berlaku lagi sejak perubahan ini :
$direction = strtolower($direction) == 'asc' ? 'asc' : 'desc';
sunting: Sekarang Anda dapat menggunakan metode orderByRaw () :
->orderByRaw('RAND()')
. Namun ini masih bukan DB-agnostik.FWIW, CodeIgniter mengimplementasikan khusus
RANDOM
arah penyortiran , yang diganti dengan tata bahasa yang benar ketika membangun kueri. Juga tampaknya cukup mudah diimplementasikan. Sepertinya kami memiliki kandidat untuk meningkatkan Laravel :)pembaruan: inilah masalah tentang ini di GitHub, dan permintaan tarik saya yang tertunda .
edit 2: Mari kita memotong pengejaran. Karena Laravel 5.1.18 Anda dapat menambahkan makro ke pembuat kueri:
Pemakaian:
edit 3: Akhirnya! Karena Laravel 5.2.33 ( changelog , PR # 13642 ) Anda dapat menggunakan metode asli
inRandomOrder()
:sumber
Dalam LARAVEL 4 dan 5 yang
order_by
digantikan olehorderBy
Jadi, seharusnya:
sumber
Anda bisa menggunakan :
sumber
Untuk Laravel 5.2> =
gunakan metode Eloquent:
Metode inRandomOrder dapat digunakan untuk mengurutkan hasil permintaan secara acak. Misalnya, Anda dapat menggunakan metode ini untuk mengambil pengguna acak:
dari docs: https://laravel.com/docs/5.2/queries#ordering-grouping-limit-and-offset
sumber
Anda juga dapat menggunakan metode order_by dengan fasih dan fasih seperti:
Ini sedikit aneh penggunaannya, tetapi berhasil.
Sunting: Seperti yang dikatakan @Alex, penggunaan ini lebih bersih dan juga berfungsi:
sumber
Gunakan fungsi Laravel
sumber
Anda dapat dengan mudah menggunakan perintah ini:
// Pertanyaan: nama Model
// ambil 10 baris dari DB Dalam catatan acak ...
sumber
Saya lebih memilih untuk menentukan dulu atau gagal:
sumber
Laravel memiliki metode bawaan untuk mengocok urutan hasil.
Berikut ini kutipan dari dokumentasi:
Metode acak mengacak item dalam koleksi:
Anda dapat melihat dokumentasinya di sini .
sumber
Pada model Anda, tambahkan ini:
kemudian pada route / controller
sumber
Ada juga
whereRaw('RAND()')
yang melakukan hal yang sama, maka Anda dapat rantai->get()
atau->first()
atau bahkan gila dan menambahkan->paginate(int)
.sumber
Saya punya meja dengan ribuan catatan, jadi saya butuh sesuatu dengan cepat. Ini adalah kode saya untuk baris acak semu:
sumber
$count
hanya yang pertama yang akan diambil, dan itu juga akan lebih mungkin untuk diambil daripada baris lainnya.