Mình cần thiết lập truy vấn lấy ngẫu nhiên dữ liệu trong bảng mysql. Câu truy vấn thuần như sau:
SELECT */column FROM table ORDER BY RAND() LIMIT 1
Trong câu trên, truy vấn sẽ lấy toàn bộ dữ liệu (nếu dùng *), hoặc lấy từ cột có tên "column", trong bảng có tên "table", sắp xếp theo ngẫu nhiên rand(), giới hạn lấy dữ liệu ra là 1. Các thông số này có thể tùy chỉnh, it means optional/subjective choice.
Giờ thử qua Laravel. Thằng Framework này khá lỏng lẻo/linh hoạt, aka unrestricted/flexible trong việc khai báo và sử dụng truy vấn dữ liệu. Ba cách của Laravel là:
Cách 1: Thử random bằng Eloquent
$data['anh'] = Picture::inRandomOrder()->take(100)->get();
Giả sử trong Controller của mình mình tạo một biến $data có chứa key của array sẽ được truyền vào view là "anh", mình dùng truy vấn của Eloquent bằng cách khai báo dùng model có tên Picture. Model này tương ứng với việc truy cập bảng "pictures" (khai trong Model trên). Phương thức sau dấu :: là inRandomOrder() và lấy take(100) rồi dùng get(); để lấy ra. Sau đó qua View, vì dữ liệu xuất của Eloquent là Collection nên mình chỉ cần dùng foreach đổ dữ liệu ra là xong.
Tuy nhiên, nghe nói cách này chậm.
Cách 2: Giờ tới cách này, cũng là Eloquent
$data['anh'] = Picture::latest('id')->take(20)->get();
Mình vẫn dùng Model có tên Picture và dùng lastest để xuất ra các record mới nhất. Mình thử đặt tham số trong hàm latest và KHÔNG ĐẶT tham số thì thấy đều okey.
Cách 3: Nghe nói Query Builder nhanh hơn.
$data['anh'] = DB::table('pictures')
->inRandomOrder()
->take(15)
->get();
Mình dùng lớp DB tạo sẵn và truy vấn trong bảng 'pictures', dùng hàm inRandomOrder để lấy ngẫu nhiên, take() lấy số lượng, dùng get() để đổ ra.
Noted là: 3 cách trên đều okey.
Laravel có 4 cách truy vấn dữ liệu: thuần, thuần kiểu Laravel (dùng facade/db), Query Builder và Eloquent.
Nên dùng Query Builder hoặc Eloquent.
Tham khảo thêm tại: https://stackoverflow.com/questions/40777417/take-10-random-rows-from-the-top-100
No comments:
Post a Comment