Laravel Eloquent: Đặt hàng kết quả của tất cả ()


214

Tôi bị mắc kẹt trong một nhiệm vụ đơn giản. Tôi chỉ cần đặt hàng kết quả đến từ cuộc gọi này

$results = Project::all();

Trong trường hợp Projectlà một mô hình. Tôi đã thử điều này

$results = Project::all()->orderBy("name");

Nhưng nó không hoạt động. Đó là cách tốt hơn để có được tất cả dữ liệu từ một bảng và đặt chúng theo thứ tự?

Câu trả lời:



114

Bạn vẫn có thể sử dụng sortBy (ở cấp bộ sưu tập) thay vì orderBy (ở cấp truy vấn) nếu bạn vẫn muốn sử dụng tất cả () vì nó trả về một bộ sưu tập các đối tượng.

Thứ tự tăng dần

$results = Project::all()->sortBy("name");

Thứ tự giảm dần

$results = Project::all()->sortByDesc("name");

Kiểm tra các tài liệu về Bộ sưu tập để biết thêm chi tiết.

https://laravel.com/docs/5.1/collections


Chính xác những gì tôi đang tìm kiếm. Việc sử dụng rộng rãi này có bất kỳ nhược điểm nào so với việc sử dụng orderByở cấp truy vấn không?
Giedrius

1
\ @foreach ($ post-> sortByDesc ('created_at') là $ post) \ @include ('post.post') \ @endforeach
sdapi

2
Tôi muốn biết làm thế nào điều này hoạt động đằng sau hậu trường. Nó tấn công tôi như thể sắp xếp bộ sưu tập sortBy()xảy ra bên trong Công cụ Laravel (bằng PHP), trong khi việc orderBy()này được thực hiện trong cơ sở dữ liệu. Chắc chắn cơ sở dữ liệu sẽ nhanh hơn trong hầu hết các tình huống có thể hiểu được và khi dữ liệu của bạn tăng lên, sự chênh lệch về hiệu suất sẽ tăng. Tôi rất thích nghe suy nghĩ của người khác về điều này.
cartb Beforehorse

3
@cartb Beforehorse Bạn cần biết phương thức nào trả về cái gì. :: all () có lẽ chỉ cần gọi -> get () dưới mui xe, đến lượt nó trả về một bộ sưu tập. sortBy () là một phương thức của một bộ sưu tập, vì vậy, nó xảy ra ở phía PHP (trái ngược với orderBy () được gọi trên một đối tượng truy vấn). Đó là một ý tưởng tồi để sử dụng :: all (), nói gì đến việc sắp xếp nó trong PHP. Hãy tưởng tượng nếu :: all () trả về một bộ sưu tập với hàng triệu đối tượng. Sẽ mất quá nhiều thời gian để tìm nạp nó và thậm chí nhiều thời gian hơn để sắp xếp nó trong PHP. Tất nhiên, bạn có thể sử dụng :: all () nếu bạn biết chắc chắn nó sẽ trả về chỉ một số đối tượng (trong một bộ sưu tập).
Avram

Tại sao câu hỏi này không phải là câu trả lời được chấp nhận? nó đã làm việc với hàm all ().
VishalParkash

36

Ngoài ra, chỉ cần thực hiện các câu trả lời trước, nó cũng có thể được sắp xếp theo thứ tự giảm dần deschoặc tăng dần ascbằng cách thêm vào làm tham số thứ hai.

$results = Project::orderBy('created_at', 'desc')->get();

14

Cập nhật 2017


Laravel 5.4 đã thêm các phương thức orderByDesc () vào trình xây dựng truy vấn:

$results = Project::orderByDesc('name')->get();

10

Trong khi bạn cần kết quả cho ngày như desc

$results = Project::latest('created_at')->get();

9

LÀM CÁI NÀY:

$results = Project::orderBy('name')->get();

ĐỪNG LÀM ĐIỀU NÀY:

$results = Project::all()->sortBy('name');

TẠI SAO? Tóm lại, cách tiếp cận thứ nhất nhanh hơn cách tiếp cận thứ hai.


3
Sẽ tốt hơn nếu thêm giải thích tại sao: Cách tiếp cận đầu tiên tạo ra thứ tự ở mức cơ sở dữ liệu (truy vấn) gần như luôn hiệu quả hơn nhiều - hiệu suất tốt nhất. Tôi sẽ nói sử dụng Phương pháp mô hình luôn, khi bạn sẽ cần cách tiếp cận thứ hai, bạn sẽ biết :)
jave.web


4

Lưu ý, bạn có thể làm:

$results = Project::select('name')->orderBy('name')->get();

Điều này tạo ra một truy vấn như:

"SELECT name FROM proyect ORDER BY 'name' ASC"

Trong một số ứng dụng khi DB không được tối ưu hóa và truy vấn phức tạp hơn và bạn cần ngăn việc tạo ORDER BY trong SQL kết thúc, bạn có thể thực hiện:

$result = Project::select('name')->get();
$result = $result->sortBy('name');
$result = $result->values()->all();

Bây giờ là php người đặt hàng kết quả.


0

Hướng dẫn của bạn yêu cầu gọi để nhận, bởi vì nó mang lại các bản ghi và đặt hàng.

$results = Project::orderBy('name')
           ->get();

Thí dụ:

$results = Result::where ('id', '>=', '20')
->orderBy('id', 'desc')
->get();

Trong ví dụ, dữ liệu được lọc theo "where" và mang các bản ghi lớn hơn 20 và danh mục orderBy theo thứ tự từ cao đến thấp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.