Wie verwende ich Order By für mehrere Spalten in Laravel 4?

230

Ich möchte mehrere Spalten in Laravel 4 mithilfe der Methode orderBy()in Laravel Eloquent sortieren . Die Abfrage wird mit Eloquent wie folgt generiert:

SELECT *
FROM mytable
ORDER BY
  coloumn1 DESC, coloumn2 ASC

Wie kann ich das machen?

Sophy
quelle
Sehr einfach. User::orderBy('name', 'DESC') ->orderBy('email', 'ASC') ->get();
Ich bin die dümmste Person

Antworten:

371

Rufen orderBy()Sie einfach so oft auf, wie Sie es benötigen. Zum Beispiel:

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

Erzeugt die folgende Abfrage:

SELECT * FROM `users` ORDER BY `name` DESC, `email` ASC
rmobis
quelle
16
Es wäre schön, wenn wir ein Array übergeben könnten wie: User::orderBy(array('name'=>'desc', 'email'=>'asc'))
JoshuaDavid
10
@ FireCoding, können Sie tun$user->orders = array(array('column' => 'name', 'direction' => 'desc'), array('column' => 'email', 'direction' => 'asc'));
rmobis
Gibt es eine Möglichkeit, einer etablierten Abfrage eine orderBy hinzuzufügen?
Rafael
@ Rafael, wenn Sie es noch nicht ausgeführt haben (angerufen getoder first), rufen Sie orderByes einfach an. Sonst nein.
RMOBIS
Wenn Sie andernfalls immer nach absteigend bestellen müssen, können Sie auch latest () verwenden.
SSI-Anik
30

Sie können tun, was @rmobis in seiner Antwort angegeben hat: [Etwas mehr hinzufügen]

Mit order byzweimal:

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

und der zweite Weg, es zu tun, ist,

Verwenden von raw order by:

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

Beide erzeugen dieselbe Abfrage wie folgt:

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

Wie @rmobis in Kommentar von erster Antwort angegeben Sie können wie ein Array an , um nach der Kolonne passieren wie diese,

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

Eine weitere Möglichkeit ist die iterateSchleife.

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

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

$results = $query->get();

Ich hoffe es hilft :)

Sagar Naliyapara
quelle
Kann ich orderByRaw UND orderBy zusammen verwenden? scheint nicht für mich zu funktionieren, die resultierende Abfrage scheint nur orderByRaw
Return-1
Versuchen Sie zuerst orderBy und dann orderByRaw zu setzen und sehen Sie das Ergebnis @GeorgeAvgoustis
Sagar Naliyapara
Leider ist dies nicht möglich, da es zuerst randomisiert und dann nach dem endgültigen Qualifikationsmerkmal sortiert werden muss.
Rückkehr-1
1
Es funktioniert möglicherweise zusammen, weil bei der Sortierung der ersten Spalte die Sortierung der zweiten Spalte nicht
angezeigt wird
2

Hier ist ein weiteres Ausweichen, das ich mir für meine Basis-Repository-Klasse ausgedacht habe, in der ich nach einer beliebigen Anzahl von Spalten bestellen musste:

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;
}

Jetzt können Sie Ihren Anruf folgendermaßen tätigen:

$allUsers = $userRepository->findAll([], [], ['name', 'DESC', 'email', 'ASC'], 100);
mpemburn
quelle