如何使用 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文件导入导出的功能详解