php - two - ¿Cómo usar order by para múltiples columnas en laravel 4?
like laravel (3)
Aquí hay otro truco que se me ocurrió para mi clase de repositorio base donde necesitaba ordenar por un número arbitrario de columnas:
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;
}
Ahora puedes hacer tu llamada así:
$allUsers = $userRepository->findAll([], [], [''name'', ''DESC'', ''email'', ''ASC''], 100);
Quiero ordenar columnas múltiples en Laravel 4 mediante el método de uso orderBy()
de Eloquent. La consulta generará por Eloquent de esta manera:
SELECT *
FROM mytable
ORDER BY
coloumn1 DESC, coloumn2 ASC
¿Como lo puedo hacer?
Puedes hacer lo que @rmobis ha especificado en su respuesta, [Añadiéndole algo más]
Usar el order by
dos veces:
MyTable::orderBy(''coloumn1'', ''DESC'')
->orderBy(''coloumn2'', ''ASC'')
->get();
y la segunda forma de hacerlo es
Usando raw order by
:
MyTable::orderByRaw("coloumn1 DESC, coloumn2 ASC");
->get();
Ambos producirán la misma consulta que sigue,
SELECT * FROM `my_tables` ORDER BY `coloumn1` DESC, `coloumn2` ASC
Como se especifica @rmobis en el comentario de la primera respuesta, puede pasar como una matriz para ordenar por columna de esta manera,
$myTable->orders = array(
array(''column'' => ''coloumn1'', ''direction'' => ''desc''),
array(''column'' => ''coloumn2'', ''direction'' => ''asc'')
);
una forma más de hacerlo es iterate
en loop,
$query = DB::table(''my_tables'');
foreach ($request->get(''order_by_columns'') as $column => $direction) {
$query->orderBy($column, $direction);
}
$results = $query->get();
Espero eso ayude :)
Simplemente invoque orderBy()
tantas veces como lo necesite. Por ejemplo:
User::orderBy(''name'', ''DESC'')
->orderBy(''email'', ''ASC'')
->get();
Produce la siguiente consulta:
SELECT * FROM `users` ORDER BY `name` DESC, `email` ASC