web-dev-qa-db-ja.com

LaravelコレクションsortByが有効にならない

いくつかのデータベースクエリの結果を組み合わせて並べ替えようとしています。

$events = collect();

$downedEvents = EventDowned::where('mission', $missionId)
   ->orderBy('mission_time', 'asc')
   ->get();

$events->Push($downedEvents);

$getInOutEvents = EventGetInOut::where('mission', $missionId)
   ->orderBy('mission_time', 'asc')
   ->get();

$events->Push($getInOutEvents);

$missileEvents = EventMissile::where('mission', $missionId)
   ->orderBy('mission_time', 'asc')
   ->get();

$events->Push($missileEvents);

$flattenedEvents = $events->flatten();
$sortedEvents = $flattenedEvents->sortBy('mission_time');

return $sortedEvents->all();

結果は次のようになります。

ss

ご覧のとおり、結果は正しく結合されていますが、並べ替えではなく、元のクエリ順序のままです。

私も試しました

$sortedEvents = $flattenedEvents->sortBy(function($event) {
    return (int) $event->mission_time;
});
11
Titan

私の側では大きな失敗でした。私のきれいな印刷JSON chrome拡張機能は表示順序をいじっていました。生の応答を見ると、実際に正しくソートされていることがわかりました... :: facepalm ::

13
Titan

@Titanの答えを拡張するために、extensions/postmanは配列のインデックス付け順序を維持していると思います。よくわかりません。

それを取り除くために

return $collection->values();

これが例です

$arr = collect([
  0 => [
      'name' => 'foo',
      'weight' => 70
  ],
  1 => [
      'name' => 'bar',
      'weight' => 80
  ]
 ]);

return $arr->sortByDesc('weight');

拡張機能は引き続きインデックスの順序を維持します

return $arr->sortByDesc('weight')->values();

これにより、目的の順序が取得されます。

8
fayz