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] 更改为 -&gt;first() 以从组集合中选择第一个项目【参考方案2】:

你可以使用

->groupBy(DB::raw('Date(created_at)'))

用于按日期分组,然后使用集合

【讨论】:

以上是关于Laravel 获取数组中每一天的最新数组项的主要内容,如果未能解决你的问题,请参考以下文章

获取组中每一天的最后记录

如何获取给定记录组中每一天的最后一条记录?

如何使用 .InnerHTML 方法放置特定的数组项

array类型中的迭代和归并方法

mysql查询某段时间段中每一天的数据

如何在 PostgreSQL 中获取表的每一天的第一个日期并将其转换为 JSON