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

How to add custom increment value to database with laravel excel import

我正在使用 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 将是:

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

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

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

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

例如:

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

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

我可以在 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,...)