Laravel合并多个集合并按相应的日期时间字段排序

时间:2017-12-29 18:52:28

标签: php laravel laravel-5 laravel-5.5

我将多个集合合并为一个集合,然后按日期时间对其进行排序,最终在集合之间创建时间轴。

接下来,要排序的日期时间列是不同的名称。

我能做些什么来使这个更清洁 - 可能用->merge附加foreach循环?使用foreach循环看起来很难看。 注意:下面的代码有效,但我觉得这是一种懒惰的方式,并且可能会在集合中有更多项目时变慢。

// Create timeline, sortby creation datetimes.
$TimelineItems = collect();

$TimelineItems = $Appointments->merge($lead->SalesResult);
foreach ($TimelineItems as $key => $TimelineItem) {
    if(!empty($TimelineItem->appointment_created)) {
        $TimelineItems[$key]->created_at = $TimelineItem->appointment_created;
    }
    if(!empty($TimelineItem->salesresult_created_timestamp)) {
        $TimelineItems[$key]->created_at = $TimelineItem->salesresult_created_timestamp;
    }
}
$TimelineItems = $TimelineItems->sortByDesc('created_at');
dd($TimelineItems);

1 个答案:

答案 0 :(得分:1)

最佳解决方案可能是标准化您的模型对象以使用标准日期戳字段 - 那么您就不需要对它们进行转换。

如果失败,您可以使用each()transform()

// Create timeline, sortby creation datetimes.
$TimelineItems = collect();
$AppointmentTemps = collect($Appointments);
$SalesResultTemps = $lead->SalesResult;

$TimelineItems = $AppointmentTemps
    ->merge($SalesResultTemps)
    ->transform( function ($item) {
        if(!empty($item->appointment_created)) {
            $item->created_at = $item->appointment_created;
        }
        if(!empty($item->salesresult_created_timestamp)) {
            $item->created_at = $item->salesresult_created_timestamp;
        }

        return $item;
    })
    ->sortByDesc('created_at');

dd($TimelineItems);
  

transform方法遍历集合并使用集合中的每个项调用给定的回调。集合中的项目将替换为回调返回的值:

请参阅transform()收集方法的文档以供参考。