Laravel 获取数组中每一天的最新数组项
Posted
技术标签:
【中文标题】Laravel 获取数组中每一天的最新数组项【英文标题】:Laravel get most recent array item for each day in array 【发布时间】:2021-04-22 14:16:36 【问题描述】:我正在尝试找出最佳方式(无论我是使用查询生成器还是原始 php 执行此操作),以根据给定日期的 created_at
时间戳获取最新的数组项,该数组包含许多天。
例如...
[
[
"name" => "John",
"created_at" => "2021-01-17 23:00:00"
],
[
"name" => "Jane",
"created_at" => "2021-01-17 20:00:00"
],
[
"name" => "Edward",
"created_at" => "2021-01-16 19:00:00"
],
[
"name" => "Scott",
"created_at" => "2021-01-16 17:00:00"
]
]
在上面我有两天,每天都有一个条目,我想每天获取最新的条目,例如:
[
[
"name" => "John",
"created_at" => "2021-01-17 23:00:00"
],
[
"name" => "Edward",
"created_at" => "2021-01-16 19:00:00"
]
]
我目前有一个查询可以获取两个日期之间的所有内容...
$events = GoogleAnalytics::where('event_category', $category)
->where('event_action', $action)
->whereDate('period_from', '>=', $from)
->whereDate('period_to', '<=', $to)
->orderBy('created_at', 'desc')
->get();
【问题讨论】:
【参考方案1】:使用 laravel 集合助手,您可以为每天的第一次排序集合选择最新记录,然后按天对您的集合进行分组,即分组标准,然后使用地图从每个组中选择第一个结果
$collection = $collection->sortByDesc('created_at');
$results = $collection->groupBy(function ($item, $key)
$date= new DateTime($item['created_at']);
return $date->format('Y-m-d');
);
$results = $results->map(function ($item, $key)
return $item[0];
);
结果集如下所示
Array
(
[2021-01-17] => Array
(
[name] => John
[created_at] => 2021-01-17 23:00:00
)
[2021-01-16] => Array
(
[name] => Edward
[created_at] => 2021-01-16 19:00:00
)
)
DEMO
或者另一个更短的版本是 group , map + sort
$results = $collection->groupBy(function ($item, $key)
$date= new DateTime($item['created_at']);
return $date->format('Y-m-d');
);
$results = $results->map(function ($item, $key)
return $item->sortByDesc('created_at')->first();
);
【讨论】:
@RyanHolton 小改进我已将[0]
更改为 ->first()
以从组集合中选择第一个项目【参考方案2】:
你可以使用
->groupBy(DB::raw('Date(created_at)'))
用于按日期分组,然后使用集合
【讨论】:
以上是关于Laravel 获取数组中每一天的最新数组项的主要内容,如果未能解决你的问题,请参考以下文章