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_in
和 check_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);
我在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_in
和 check_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);