我将多个集合合并为一个集合,然后按日期时间对其进行排序,最终在集合之间创建时间轴。
接下来,要排序的日期时间列是不同的名称。
我能做些什么来使这个更清洁 - 可能用->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);
答案 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()收集方法的文档以供参考。