Ich möchte mehrere Spalten in Laravel 4 mithilfe der Methode sortieren orderBy()
in Laravel Eloquent. Die Abfrage wird mit Eloquent wie folgt generiert:
SELECT *
FROM mytable
ORDER BY
coloumn1 DESC, coloumn2 ASC
Wie kann ich das machen?
Sophie
Ich möchte mehrere Spalten in Laravel 4 mithilfe der Methode sortieren orderBy()
in Laravel Eloquent. Die Abfrage wird mit Eloquent wie folgt generiert:
SELECT *
FROM mytable
ORDER BY
coloumn1 DESC, coloumn2 ASC
Wie kann ich das machen?
Einfach aufrufen orderBy()
so oft wie du es brauchst. Zum Beispiel:
User::orderBy('name', 'DESC')
->orderBy('email', 'ASC')
->get();
Erzeugt die folgende Abfrage:
SELECT * FROM `users` ORDER BY `name` DESC, `email` ASC
Es wäre schön, wenn wir ein Array wie folgt übergeben könnten: User::orderBy(array('name'=>'desc', 'email'=>'asc'))
– JosuaDavid
7. Oktober 2014 um 4:24 Uhr
@FireCoding, das kannst du tun $user->orders = array(array('column' => 'name', 'direction' => 'desc'), array('column' => 'email', 'direction' => 'asc'));
– rmobis
7. Oktober 2014 um 4:47 Uhr
Gibt es eine Möglichkeit, eine OrderBy zu einer etablierten Abfrage hinzuzufügen?
– Raffael
16. Januar 2015 um 21:43 Uhr
@Rafael, wenn du es noch nicht ausgeführt hast (genannt get
oder first
), Ruf einfach an orderBy
darauf. Sonst nein.
– rmobis
17. Januar 2015 um 6:33 Uhr
Andernfalls, wenn Sie immer nach Desc bestellen müssen, können Sie auch Latest() verwenden.
– ssi-anik
10. März 2016 um 20:51 Uhr
Sie können tun, was @rmobis in seiner Antwort angegeben hat. [Adding something more into it]
Verwenden order by
zweimal:
MyTable::orderBy('coloumn1', 'DESC')
->orderBy('coloumn2', 'ASC')
->get();
und die zweite Möglichkeit ist,
Verwenden 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
Als @rmobis im Kommentar der ersten Antwort angegeben, können Sie wie ein Array übergeben, um nach Spalte zu sortieren so was,
$myTable->orders = array(
array('column' => 'coloumn1', 'direction' => 'desc'),
array('column' => 'coloumn2', 'direction' => 'asc')
);
eine weitere Möglichkeit, dies zu tun, ist iterate
in Schleife,
$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 🙂
kann ich orderByRaw UND orderBy zusammen verwenden? scheint bei mir nicht zu funktionieren, die resultierende Abfrage scheint nur orderByRaw zu respektieren
– Rücklauf-1
25. Oktober 2017 um 9:56 Uhr
Versuchen Sie zuerst orderBy und dann orderByRaw zu setzen und sehen Sie sich das Ergebnis @GeorgeAvgoustis an
– Sagar Naliyapara
25. Oktober 2017 um 10:00 Uhr
Leider ist dies nicht möglich, da es zuerst randomisiert und dann vom letzten Qualifikanten sortiert werden muss.
– Rücklauf-1
25. Oktober 2017 um 10:02 Uhr
Es funktioniert möglicherweise, weil Sie beim Anwenden der Sortierung in der ersten Spalte die Sortierung in der zweiten Spalte nicht sehen können
– Sagar Naliyapara
25. Oktober 2017 um 10:05 Uhr
Hier ist ein weiterer Trick, den ich mir für meine Basis-Repository-Klasse ausgedacht habe, bei der ich nach einer beliebigen Anzahl von Spalten ordnen 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 wie folgt tätigen:
$allUsers = $userRepository->findAll([], [], ['name', 'DESC', 'email', 'ASC'], 100);
Verwenden Sie order by wie folgt:
return User::orderBy('name', 'DESC')
->orderBy('surname', 'DESC')
->orderBy('email', 'DESC')
...
->get();
$this->data['user_posts'] = User_posts::with(['likes', 'comments' => function($query) { $query->orderBy('created_at', 'DESC'); }])->where('status', 1)->orderBy('created_at', 'DESC')->get();
Nur-Code-Antworten werden auf SO nicht empfohlen, bitte fügen Sie eine Erklärung hinzu.
– endo64
16. Mai 2021 um 22:57 Uhr
Nur-Code-Antworten werden auf SO nicht empfohlen, bitte fügen Sie eine Erklärung hinzu.
– endo64
16. Mai 2021 um 22:57 Uhr
Sehr einfach.
User::orderBy('name', 'DESC') ->orderBy('email', 'ASC') ->get();
– Ich bin die dümmste Person
29. März 2018 um 9:09 Uhr