Laravel 4で複数の列にOrder Byを使用する方法


231

orderBy()Laravel Eloquentの方法を使用して、Laravel 4の複数の列を並べ替えたい。クエリは、次のようなEloquentを使用して生成されます。

SELECT *
FROM mytable
ORDER BY
  coloumn1 DESC, coloumn2 ASC

これどうやってするの?


とてもシンプル。User::orderBy('name', 'DESC') ->orderBy('email', 'ASC') ->get();
私はほとんど愚かな人です

回答:


373

orderBy()必要な回数だけ呼び出すだけです。例えば:

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

次のクエリを生成します。

SELECT * FROM `users` ORDER BY `name` DESC, `email` ASC

16
:私たちはのような配列渡すことができればいいだろう User::orderBy(array('name'=>'desc', 'email'=>'asc'))
JoshuaDavid

10
@FireCoding、できること$user->orders = array(array('column' => 'name', 'direction' => 'desc'), array('column' => 'email', 'direction' => 'asc'));
rmobis '10 / 10/7

確立されたクエリにorderByを追加する方法はありますか?
ラファエル

@Rafael、まだ実行していない場合は(getまたはと呼ばれますfirst)、呼び出しorderByてください。そうでなければ、違います。
rmobis 2015年

それ以外の場合、常にdescで注文する必要がある場合は、latest()も使用できます。
ssi-anik 2016年

30

@rmobisが彼の答えで指定したように、[もっと何かをそれに追加する]ことができます

order by2回使用:

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

それを行う2つ目の方法は、

使用raw order by

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

どちらも次のように同じクエリを生成します。

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

最初の回答のコメントで指定されている@rmobisのように、次のように配列のように渡して列ごとに並べ替えることができます。

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

それを行うもう1つの方法はiterateループです

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

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

$results = $query->get();

それが役に立てば幸い :)


orderByRawとorderByを一緒に使用できますか?私のために働くように見えるdoes notの、結果のクエリにのみorderByRawを尊重しているようだ
戻る-1

orderByを最初に配置し、次にorderByRawを実行して、@ GeorgeAvgoustisの結果を確認してください
Sagar Naliyapara

残念ながら、最初にランダム化してから、最終的な修飾子で並べ替える必要があるため、これを行うことはできません。
Return-1

1
最初の列の並べ替えに適用すると2番目の列の並べ替えが表示されないため、一緒に機能する可能性があります
Sagar Naliyapara

3

これは、任意の数の列で並べ替える必要がある、ベースリポジトリクラスのために思いついた別の回避策です。

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

これで、次のように電話をかけることができます。

$allUsers = $userRepository->findAll([], [], ['name', 'DESC', 'email', 'ASC'], 100);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.