Laravel 7:如何从CSV文件中过滤时间



我正在学习Laravel。

我试图从CSV文件的一列中过滤第一次和最后一次,并将其存储在数据库的两个不同列中。

如何为这个逻辑编写代码。

我有一个用户表,其中没有,名称,签入,签出列。

现在我将上传一个csv文件,将有一列的时间。一个用户可以多次使用

我想存储第一次和最后一次。下面是csv文件示例:

7/5/2022 10:01:00 7/5/2022 12:01:007/5/2022 10:08:007/5/2022 10:12:007/5/2022 17:05:00

您可以查看laravel excel import https://docs.laravel-excel.com/3.1/imports/basics.html。我给你一个大概的想法:

$collection = Excel::toCollection(new UsersImport, $request->input('file'));

上面的行应该写在控制器上,你可以在https://docs.laravel-excel.com/3.1/imports/basics.html#importing-to-array-or-collection

上找到上面的详细信息接下来,你必须创建一个导入类,因为我们要导出到toCollection,你可以使用这样的东西:

namespace AppImports;
use AppUser;
use IlluminateSupportCollection;
use MaatwebsiteExcelConcernsToCollection;
class UsersImport implements ToCollection
{
public function collection(Collection $rows)
{
foreach ($rows as $row) 
{
//you can filter data from here and insert into database
}
}
}

在上面的foreach循环中,您可以访问PHP中$row变量的CSV数据,从那里您可以操作并将其存储在数据库中。详细信息请访问:https://docs.laravel-excel.com/3.1/imports/collection.html

#PS:我们在这个方法上加载所有的数据到内存,以防你的csv文件很大,你可能不得不考虑排队。

更新:

这里,是粗略的代码;这里我在check_in中存储最小的时间戳,在check_out中存储最高的时间戳。为了找到这些值,我们在check_incheck_out中都设置了第一次,如果新值小于check_in,则用新值更新check_in,对于check_out,我们检查新值是否大于旧值,如果是,则用新值替换它。

foreach($rows as $row){
if(!isset( $result[$row['id']])){
$result[$row['id']]['check_in'] = Carbon::parse($row['time']);
$result[$row['id']]['check_out'] = Carbon::parse($row['time']);
}else{
$new_time = Carbon::parse($row['time']);
$isSmallerCheckIn =  $new_time->lt($result[$row['id']]['check_in']);
if($isSmallerCheckIn){
$result[$row['id']]['check_in'] = $new_time;
}
$isGreaterCheckOut =  $new_time->gt($result[$row['id']]['check_out']);
if($isGreaterCheckOut){
$result[$row['id']]['check_out'] = $new_time;
}
}
}
dd($result);

相关内容

  • 没有找到相关文章

最新更新