いくつかのデータベースクエリの結果を組み合わせて並べ替えようとしています。
$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();
結果は次のようになります。
ご覧のとおり、結果は正しく結合されていますが、並べ替えではなく、元のクエリ順序のままです。
私も試しました
$sortedEvents = $flattenedEvents->sortBy(function($event) {
return (int) $event->mission_time;
});
私の側では大きな失敗でした。私のきれいな印刷JSON chrome拡張機能は表示順序をいじっていました。生の応答を見ると、実際に正しくソートされていることがわかりました... :: facepalm ::
@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();
これにより、目的の順序が取得されます。