Laravel5.5 DBから取得した投稿データ($posts)を独自の配列に任意に並び替える

情報 Laravel オブジェクト 並び替え ソート PHP

本来DBにクエリをかけた時点でorderByなどで並び替えをしたい。
もしくは

->orderByRaw('FIELD(pref_cd, '.$order_by_raw_str.')')

このようにorderByRawを使う方法。
クエリでは並び替えができない場面があり、PHPの方で処理するしかなくなった。

まずPHPでのオブジェクトのソートの仕方が分からなかった。
ぐぐって出てくるのは配列のソートばかり。
ぶっちゃけ検索力&理解力が低いです。

んで結局LravelのコレクションのsortByを使った。

コレクション値をどのようにソートするかを決めるため、コールバックを渡すこともできます。

とのことでそのようにした。
これはphpのuasortにあたるのかな?

$sorted = $posts->sortBy(function ($post, $key) {
    $sort_rule = array(5,6,7,0,1,2,3,4);//postIDを並び替えたい順番にして記述
    return array_search($post->id, $sort_rule);
});
@endphp

@foreach ($sorted as $key => $post)
{{ $post->name }}<br>
{{ $post->author->name }}
@endforeach

 
まぁこれで思い通りの挙動にはなった。
とはいえこんな風に並び順を指定すること自体が好ましいとは思えない。
しかたがないときもある。

Laravelおにいさん / 2018-05-28 / 284 / 1
このエントリーをはてなブックマークに追加
関連記事

コメント

そのままだと外にある変数が使えないのでuseする書き方
これで$reccomendIdsが使えるようになる

        $reccomendPosts = $reccomendPosts->sortBy(function ($post, $key) use ($reccomendIds){
anonymous / 2019-02-04