¿Cómo utilizar Ordenar por para múltiples columnas en Laravel 4?

231

Quiero ordenar varias columnas en Laravel 4 usando el método orderBy()en Laravel Eloquent. La consulta se generará usando Eloquent de esta manera:

SELECT *
FROM mytable
ORDER BY
  coloumn1 DESC, coloumn2 ASC

¿Cómo puedo hacer esto?

Sophy
fuente
Muy simple. User::orderBy('name', 'DESC') ->orderBy('email', 'ASC') ->get();
Soy la persona más estúpida

Respuestas:

374

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
rmobis
fuente
16
Sería bueno si pudiéramos pasar una matriz como: User::orderBy(array('name'=>'desc', 'email'=>'asc'))
JoshuaDavid
10
@FireCoding, puedes hacerlo$user->orders = array(array('column' => 'name', 'direction' => 'desc'), array('column' => 'email', 'direction' => 'asc'));
rmobis
¿Hay alguna manera de agregar un orderBy en una consulta establecida?
Rafael
@Rafael, si aún no lo ha ejecutado (llamado geto first), simplemente instálelo orderBy. De lo contrario, no.
rmobis
De lo contrario, si siempre necesita hacer un pedido por desc, también puede usar latest ().
ssi-anik
30

Puede hacer lo que @rmobis ha especificado en su respuesta, [Agregar algo más en él]

Usando order bydos veces:

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

y la segunda forma de hacerlo es,

Utilizando raw order by:

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

Ambos producirán la misma consulta de la siguiente manera,

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

Como @rmobis especificó 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 iterateen bucle,

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

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

$results = $query->get();

Espero eso ayude :)

Sagar Naliyapara
fuente
¿Puedo usar orderByRaw AND orderBy juntos? no parece funcionar para mí, la consulta resultante solo parece respetar orderByRaw
Return-1
intente poner orderBy primero y luego orderByRaw y vea el resultado @GeorgeAvgoustis
Sagar Naliyapara el
desafortunadamente esto no se puede hacer ya que primero debe ser aleatorizado y luego ordenar por el calificador final.
Regreso-1
1
Puede funcionar en conjunto, ya que al aplicar en la clasificación de la primera columna no se puede ver la clasificación de la segunda columna
Sagar Naliyapara
3

Aquí hay otra esquiva 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);
mpemburn
fuente