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

Laravel 7: How to Filter time from CSV file

我在Laravel的学习期。

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

如何编写此逻辑的代码。

我有用户 table,其中不存在姓名、签入、签出列。

现在我要上传一个csv文件,里面会有时间一栏。一个用户可以多次。

我要存储第一次和最后一次。 这是 csv 文件示例:

id name time
1 Jhon 7/5/2022 10:01:00
1 Jhon 7/5/2022 12:01:00
2 Doe 7/5/2022 10:08:00
3 Smith 7/5/2022 10:12:00
1 Jhon 7/5/2022 17:05:00

假设,Jhon (id=1) 有多次。这里我想存储第一次入住和最后一次退房。 我怎样才能在 Laravel 7 中做到这一点?

你可以看看 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

上找到上面的详细信息

接下来,你必须创建一个导入 class,因为我们要导出到 toCollection,你可以使用这样的东西:

namespace App\Imports;

use App\User;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;

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

在上面的 foreach 循环中,您可以访问 $row 变量上 PHP 上的 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);