如何使用 laravel excel 导入向数据库添加自定义增量值

Posted

技术标签:

【中文标题】如何使用 laravel excel 导入向数据库添加自定义增量值【英文标题】:How to add custom increment value to database with laravel excel import 【发布时间】:2022-01-21 07:06:13 【问题描述】:

我正在使用 maatwebsite laravel excel 将一些数据从 excel 导入数据库。但我想为每行数据添加一些具有增量值的自定义 ID。 目前,我可以将数据与一些输入值形式一起导入。

数据导入文件

class DataImport implements ToModel, WithStartRow

public function model(array $row)

       
    return new Tempdat([
        'employee_id' => ??? (combination of client_code +1)
        'name' => $row[1],
        'gender' => $row[2],
        'bod' => $this->transformDate($row[3]),
        'engagement_code' => request('engagement_code'), //from input form
        'client_code' => request('client_code'), //from input form
    ]);


public function transformDate($value, $format = 'Y-m-d')

    try 
        return \Carbon\Carbon::instance(\phpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value));
     catch (\ErrorException $e) 
        return \Carbon\Carbon::createFromFormat($format, $value);
    


public function startRow(): int

    return 2;
 

数据控制器文件

public function ImportExcel(Request $request)
   
    $this->validate($request,[
        'file' => 'required|mimes:xls,xlsx',
        'engagement_code' => 'required',
    ]);

    $file = $request->file('file');
    $clientCode = request('client_code');
    $engagementCode = request('engagement_code');
    $todayDate = date('dFY');

    $file_name = $engagementCode.'_'.$todayDate.$file->getClientOriginalName();
    $file->move('tempdat',$file_name);

    Excel::import(new DataImport, public_path('/tempdat/'.$file_name));


    return redirect()->route('dashboard.tempdat.index');

我想做的是为每一行添加“员工代码”,它是“client_code”+ 1 的组合。例如,如果 client_code 是 ABCD 并且导入了 3 行数据,那么 employee_code 将是:

ABCD0001 ABCD0002 ABCD0003 ...

我已经在搜索计数行,但还没有找到。

【问题讨论】:

【参考方案1】:

每当您从表中删除一条记录时,计算行数都会给您带来问题:如果您的主 employee_id 字段具有 UNIQUE 键,您将无法插入新行,或者您将开始插入重复的 ID。

我也不建议在 PHP 中生成 ID,因为如果尝试同时存储两条记录,您可能会遇到完整性问题。

我会使用默认模型的 model_id 字段和自动增量来确保我不会在分配 ID 时遇到问题,并且在保存记录后我会立即更新 employee_id 字段的 ID,这也可以键为“主要”,以便高效地进行索引和访问。

例如:

class MyModel extends Model 
    public function save() 
        if(parent::save()) 
            $this->update['employee_id' => "ABCD".$this->id];
        
    

我还没有意识到您使用的 Excel 库是如何处理模型的,但我想它可以在过程中的某个地方指定。

【讨论】:

嘿,谢谢您的回复。顺便说一句,employee_id 不是这里的主键,所以这就是我使用增量值的原因。我找到了使用 laravel-id-generator 生成这种 ID 的解决方案。我把它写在下面的帖子里。【参考方案2】:

我可以使用这个在 laravel excel 中生成增量 ID:

https://github.com/haruncpi/laravel-id-generator

$config = [
        'table' => 'table_name',
        'length' => 7,
        'field' => 'employee_id',
        'prefix' => request('client_code'),
        'reset_on_prefix_change' => true,
    ];

    $employee_id = IdGenerator::generate($config);

因此,每次执行导入时,employee_id 都会自行生成,并带有 client_code 前缀(例如:ABCD001,...)

【讨论】:

以上是关于如何使用 laravel excel 导入向数据库添加自定义增量值的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解

向ArcGIS导入OpenStreetMap数据

在laravel中将Excel导入数据库?

为Laravel Voyager创建数据导入页面

Laravel 使用 PhpOffice 导入导出 Excel

如何在 Laravel 中导入具有各种模型(和子数据/模型)的单个 excel 文件/工作表?