【问题标题】:How to add custom increment value to database with laravel excel import如何使用 laravel excel 导入向数据库添加自定义增量值
【发布时间】: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
  • ...

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

【问题讨论】:

    标签: php laravel laravel-8


    【解决方案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,...)

    【讨论】:

      猜你喜欢
      • 2021-06-07
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 2018-01-18
      • 2018-12-19
      • 1970-01-01
      • 2022-07-03
      • 1970-01-01
      相关资源
      最近更新 更多