Laravel 获取数组中每一天的最新数组项
Laravel get most recent array item for each day in array
我正在尝试找出最佳方法(无论是使用查询生成器还是原始 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();
使用laravel collections helper,您可以选择每天的最新记录,首先对集合进行排序,然后按天对您的集合进行分组,即分组标准,然后使用地图从每个组中选择第一个结果
$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
)
)
或者另一个更短的版本是 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();
});
您可以使用
->groupBy(DB::raw('Date(created_at)'))
用于按日期分组,然后使用集合
我正在尝试找出最佳方法(无论是使用查询生成器还是原始 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();
使用laravel collections helper,您可以选择每天的最新记录,首先对集合进行排序,然后按天对您的集合进行分组,即分组标准,然后使用地图从每个组中选择第一个结果
$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
)
)
或者另一个更短的版本是 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();
});
您可以使用
->groupBy(DB::raw('Date(created_at)'))
用于按日期分组,然后使用集合