
📌 Sử dụng Raw Query để Order Kết Quả trong Laravel
Trong Laravel, bạn có thể sử dụng raw SQL expressions để tuỳ chỉnh sắp xếp (ORDER BY) khi truy vấn Eloquent.
🔹 Cách 1: Dùng orderByRaw()
Laravel cung cấp phương thức orderByRaw()
, cho phép truyền vào một truy vấn SQL tùy chỉnh để sắp xếp kết quả.
📝 Ví dụ 1: Sắp xếp theo độ dài chuỗi
Giả sử bạn muốn sắp xếp danh sách người dùng theo độ dài của tên (LENGTH(name)
):
use App\Models\User;
use Illuminate\Support\Facades\DB;
$users = User::orderByRaw('LENGTH(name) DESC')->get();
📌 Kết quả: User có tên dài nhất sẽ được xếp đầu.
📝 Ví dụ 2: Sắp xếp theo điều kiện tuỳ chỉnh
Giả sử bạn có danh sách sản phẩm, trong đó:
- Nếu trạng thái là
"featured"
, sản phẩm sẽ đứng đầu. - Sau đó, sắp xếp tiếp theo
created_at
.
Bạn có thể sử dụng orderByRaw()
như sau:
$products = Product::orderByRaw("CASE WHEN status = 'featured' THEN 1 ELSE 2 END")
->orderBy('created_at', 'desc')
->get();
📌 Kết quả:
- Các sản phẩm có status = 'featured' sẽ đứng đầu.
- Sau đó, các sản phẩm khác sẽ được sắp xếp theo
created_at
giảm dần.
📝 Ví dụ 3: Sắp xếp theo nhiều giá trị cụ thể
Bạn có danh sách đơn hàng (orders
), và bạn muốn sắp xếp theo một danh sách trạng thái cố định:
- "pending" (chờ xử lý) trước
- "processing" (đang xử lý) sau
- "completed" (hoàn thành) cuối cùng
Bạn có thể dùng FIELD() trong MySQL:
$orders = Order::orderByRaw("FIELD(status, 'pending', 'processing', 'completed')")->get();
📌 Kết quả:
- Các đơn hàng pending xuất hiện trước.
- Tiếp theo là processing.
- Cuối cùng là completed.
🔹 Cách 2: Dùng DB::raw()
kết hợp với orderBy()
Ngoài orderByRaw()
, bạn có thể dùng DB::raw()
trong orderBy()
:
use Illuminate\Support\Facades\DB;
$users = User::orderBy(DB::raw('LENGTH(name)'), 'desc')->get();
📌 Cách này tương tự orderByRaw()
, nhưng không linh hoạt bằng.
📌 Khi nào nên dùng orderByRaw()
?
Trường hợp | Nên dùng? |
---|---|
Sắp xếp theo biểu thức SQL phức tạp (CASE, FIELD, LENGTH) | ✅ Có |
Chỉ cần sắp xếp theo cột thông thường (created_at , name ) |
❌ Không cần |
Sắp xếp theo thứ tự tuỳ chỉnh (status = 'featured' trước) | ✅ Có |
Sử dụng database không hỗ trợ các hàm SQL nâng cao | ❌ Không nên |
🎯 Kết luận
orderByRaw()
là cách mạnh mẽ để sắp xếp theo điều kiện đặc biệt màorderBy()
không hỗ trợ.- Có thể sử dụng CASE, FIELD, LENGTH, hoặc bất kỳ SQL function nào.
- Nếu chỉ cần sắp xếp theo cột đơn giản, nên dùng
orderBy()
.
🚀 Dùng orderByRaw()
khi cần logic sắp xếp phức tạp!
Danh mục
Bài viết liên quan

Hiển thị giá trị trong Blade
Author: | ADMIN |
---|

Cấu Trúc Điều Kiện và Vòng Lặp Trong Blade
Author: | ADMIN |
---|

Layout: @include, @extends, @section, @yield
Author: | ADMIN |
---|

Blade Components
Author: | ADMIN |
---|
Bài viết khác

Blade Basics
Author: | ADMIN |
---|

9 Mẹo Hữu Ích Khi Sử Dụng Blade Trong Laravel
Author: | ADMIN |
---|

Hiển thị giá trị trong Blade
Author: | ADMIN |
---|