こんにちは!タクマです。
31歳未経験からエンジニア転職に成功し、
2021年3月より都内の受託開発企業にてサーバーサイドエンジニアとして働いており、
PHP/Laravelを使用し開発をしています。
今回はLaravelでCollectionの順番を並び替える方法をまとめました。
指定したキーの昇順で並び替える
指定したキーの昇順で並び替えるにはsortBy()
メソッドを使います。
例として下記の$users
のCollectionを年齢の若い順に並び替えます。
$users = collect([
['id' => 1, 'name' => '坂本', 'age' => 47],
['id' => 2, 'name' => '柳田', 'age' => 35],
['id' => 3, 'name' => '菅野', 'age' => 29],
['id' => 4, 'name' => '田中', 'age' => 51],
['id' => 5, 'name' => '森下', 'age' => 33],
]);
$sortUsers = $users->sortBy('age'); // 引数にキーを入れる
dd($sortUsers);
実行結果は下記のようになります。
Illuminate\Support\Collection {#279 ▼
#items: array:5 [▼
2 => array:3 [▼
"id" => 3
"name" => "菅野"
"age" => 29
]
4 => array:3 [▼
"id" => 5
"name" => "森下"
"age" => 33
]
1 => array:3 [▼
"id" => 2
"name" => "柳田"
"age" => 35
]
0 => array:3 [▼
"id" => 1
"name" => "坂本"
"age" => 47
]
3 => array:3 [▼
"id" => 4
"name" => "田中"
"age" => 51
]
]
}
しっかりと年齢の若い順に並び替えされていますね。
指定したキーの降順で並び替える
指定したキーの降順で並び替えるにはsortByDesc()
メソッドを使います。
$users = collect([
['id' => 1, 'name' => '坂本', 'age' => 47],
['id' => 2, 'name' => '柳田', 'age' => 35],
['id' => 3, 'name' => '菅野', 'age' => 29],
['id' => 4, 'name' => '田中', 'age' => 51],
['id' => 5, 'name' => '森下', 'age' => 33],
]);
$sortUsers = $users->sortByDesc('age'); // 引数にキーを入れる
dd($sortUsers);
実行結果は下記のようになります。
Illuminate\Support\Collection {#279 ▼
#items: array:5 [▼
3 => array:3 [▼
"id" => 4
"name" => "田中"
"age" => 51
]
0 => array:3 [▼
"id" => 1
"name" => "坂本"
"age" => 47
]
1 => array:3 [▼
"id" => 2
"name" => "柳田"
"age" => 35
]
4 => array:3 [▼
"id" => 5
"name" => "森下"
"age" => 33
]
2 => array:3 [▼
"id" => 3
"name" => "菅野"
"age" => 29
]
]
}
今度は年齢の高い順に並び替えされていますね。
指定した順番で並び替える
次は指定した順番で並び替える、つまり並び順を決めその並び通りのCollectionを取得する方法です。
※先ほどまでの例で出していたIlluminate\Support\Collectionには下記のorderByRaw()メソッドは使えません。
orderByRaw()メソッドが使えるのはIlluminate\Database\Eloquent\Collectionになりますので、下記のように記載しています。
$ids = [4, 2, 5, 1, 3];
$idsOrder = implode(', ', $ids);
// idが1,2,3,4,5の並び順で取得されてしまう
$users = User::whereIn('id', $ids)->get()
// idが4,2,5,1,3の並び順で取得できる
$sortUsers = User::whereIn('id', $ids)->orderByRaw("FIELD(id, $idsOrder)")->get();
whereIn()
メソッドだけでは期待する順番通りに取得できませんが、orderByRaw(FIELD)
メソッドを組み合わせることで期待する順番通りに取得することができます!
ちなみにFIELD
とは指定した並び順に替えるMySQLの関数になります。
※FIELD関数について詳しく知りたい方はこちらの記事をご覧ください。
なので、orderByRaw(FIELD)
メソッドはDBがMySQLの場合にしか使えない可能性が高いです。(他のDBで試した訳ではないので確定的なことは言えませんが。)
さいごに
いかがでしたでしょうか?
Collectionの順番を並び替える方法それぞれについて理解できましたでしょうか?
ご質問やご指摘等ある方はコメントしていただければ返信させていただきます。
これからもLaravelエンジニアの方、Laravel学習中の初学者の方に役に立つ記事を更新していきますのでよろしくお願いします!
Twitterでも情報発信をしていますので、よかったらフォローをお願いします(^^)