Làm thế nào để sử dụng thứ tự cho nhiều cột trong Laravel 4?


231

Tôi muốn sắp xếp nhiều cột trong Laravel 4 bằng cách sử dụng phương thức orderBy()trong Laravel Eloquent. Truy vấn sẽ được tạo bằng Eloquent như thế này:

SELECT *
FROM mytable
ORDER BY
  coloumn1 DESC, coloumn2 ASC

Tôi có thể làm cái này như thế nào?


Rất đơn giản. User::orderBy('name', 'DESC') ->orderBy('email', 'ASC') ->get();
Tôi là người ngu ngốc nhất

Câu trả lời:


373

Đơn giản chỉ cần gọi orderBy()nhiều lần như bạn cần. Ví dụ:

User::orderBy('name', 'DESC')
    ->orderBy('email', 'ASC')
    ->get();

Tạo truy vấn sau:

SELECT * FROM `users` ORDER BY `name` DESC, `email` ASC

16
Sẽ thật tuyệt nếu chúng ta có thể vượt qua một mảng như: User::orderBy(array('name'=>'desc', 'email'=>'asc'))
JoshuaDavid

10
@FireCoding, bạn có thể làm$user->orders = array(array('column' => 'name', 'direction' => 'desc'), array('column' => 'email', 'direction' => 'asc'));
rmobis

Có cách nào để thêm một orderBy trên một truy vấn đã thiết lập không?
Rafael

@Rafael, nếu bạn chưa chạy nó (được gọi gethoặc first), chỉ cần gọi orderBynó. Khác, không.
rmobis

Mặt khác, nếu bạn luôn cần phải đặt hàng bằng desc, thì bạn cũng có thể sử dụng mới nhất ().
ssi-anik

30

Bạn có thể làm như @rmobis đã chỉ định trong câu trả lời của anh ấy, [Thêm một cái gì đó nữa vào nó]

Sử dụng order byhai lần:

MyTable::orderBy('coloumn1', 'DESC')
    ->orderBy('coloumn2', 'ASC')
    ->get();

và cách thứ hai để làm điều đó là,

Sử dụng raw order by:

MyTable::orderByRaw("coloumn1 DESC, coloumn2 ASC");
    ->get();

Cả hai sẽ tạo ra cùng một truy vấn như sau,

SELECT * FROM `my_tables` ORDER BY `coloumn1` DESC, `coloumn2` ASC

Như @rmobis được chỉ định trong nhận xét của câu trả lời đầu tiên, bạn có thể chuyển như một mảng để sắp xếp theo cột như thế này,

$myTable->orders = array(
    array('column' => 'coloumn1', 'direction' => 'desc'), 
    array('column' => 'coloumn2', 'direction' => 'asc')
);

một cách nữa để làm điều đó là iteratetrong vòng lặp,

$query = DB::table('my_tables');

foreach ($request->get('order_by_columns') as $column => $direction) {
    $query->orderBy($column, $direction);
}

$results = $query->get();

Hy vọng nó giúp :)


Tôi có thể sử dụng orderByRaw VÀ orderBy cùng nhau không? dường như không hoạt động đối với tôi, truy vấn kết quả dường như chỉ tôn trọng trật tựByRaw
Trả về-

hãy thử đặt hàng trước, sau đó đặt hàngByRaw và xem kết quả @GeorgeAvgoustis
Sagar Naliyapara

Thật không may, điều này không thể được thực hiện vì trước tiên nó cần được chọn ngẫu nhiên và sau đó đặt hàng bởi vòng loại cuối cùng.
Trả lại-ngày 1

1
Nó hoạt động cùng nhau có thể là do áp dụng cho sắp xếp cột đầu tiên, bạn không thể thấy sắp xếp cột thứ hai
Sagar Naliyapara

3

Đây là một cách né tránh khác mà tôi đã đưa ra cho lớp kho lưu trữ cơ sở của mình, nơi tôi cần đặt hàng theo số lượng cột tùy ý:

public function findAll(array $where = [], array $with = [], array $orderBy = [], int $limit = 10)
{
    $result = $this->model->with($with);
    $dataSet = $result->where($where)
        // Conditionally use $orderBy if not empty
        ->when(!empty($orderBy), function ($query) use ($orderBy) {
            // Break $orderBy into pairs
            $pairs = array_chunk($orderBy, 2);
            // Iterate over the pairs
            foreach ($pairs as $pair) {
                // Use the 'splat' to turn the pair into two arguments
                $query->orderBy(...$pair);
            }
        })
        ->paginate($limit)
        ->appends(Input::except('page'));

    return $dataSet;
}

Bây giờ, bạn có thể thực hiện cuộc gọi của mình như thế này:

$allUsers = $userRepository->findAll([], [], ['name', 'DESC', 'email', 'ASC'], 100);
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.