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

问题描述 投票:0回答:1

我有多个集合合并为一个,然后按日期时间排序,最终创建集合之间的时间轴。

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

我能做些什么来使这个更干净 - 可能用->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);
php laravel laravel-5 laravel-5.5
1个回答
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()收集方法的文档以供参考。

© www.soinside.com 2019 - 2024. All rights reserved.