Câu trả lời:
Đơ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
User::orderBy(array('name'=>'desc', 'email'=>'asc'))
$user->orders = array(array('column' => 'name', 'direction' => 'desc'), array('column' => 'email', 'direction' => 'asc'));
get
hoặc first
), chỉ cần gọi orderBy
nó. Khác, không.
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 by
hai 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à iterate
trong 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 :)
Đâ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);
User::orderBy('name', 'DESC') ->orderBy('email', 'ASC') ->get();