如何解决导致 Laravel Maatwebsites Excel 上传问题的规则请求
我在 Laravel-5.8 中使用 Maatwebsites-3.1 进行 Excel 上传。如下图所示:
使用 Maatwebsite\Excel\Concerns\WithMultipleSheets;
class EmployeesImport implements WithMultipleSheets
{
public function sheets(): array
{
return [
new FirstEmployeeSheetImport()
];
}
}
上面的函数用于调用如下所示的函数:
class FirstEmployeeSheetImport implements ToModel,WithHeadingRow,WithBatchInserts,WithValidation
{
protected $department,$employeetype,$designation,$worklocation,$nationality,$gradelevel;
private $errors = []; // array to accumulate errors
private $gendercode = ['Female' => 0,'Male' => 1];
private $hrstatus = ['Active' => 0,'Inactive' => 1];
private $maritalstatus = ['Single' => 1,'Married' => 2,'Separated' => 3,'Divorced' => 4,'Widow(er)' => 5,'Other' => 6];
use Importable;
public function model(array $row)
{
$this->worklocation = $row['work_location_id'];
$this->nationality = $row['nationality_id'];
$this->gradelevel = $row['grade_level_id'];
$employee_data = [
'employee_code' => $row['employee_code'],'first_name' => $row['first_name'],'other_name' => $row['other_name'] ?? '','last_name' => $row['last_name'],'email' => $row['email'],'email2' => $row['email2'] ?? '','line_manager_id' => $row['line_manager_id'] ?? '','gender_code' => $this->gendercode[$row['gender_code']] ?? null,'hr_status' => $this->hrstatus[$row['hr_status']] ?? null,'company_id' => Auth::user()->company_id,];
$employee = HrEmployee::create($employee_data);
}
public function getWorkLocation(){
if(!empty($this->worklocation) || !$this->worklocation){
return HrWorkLocation::where('location_name',$this->worklocation)->where('company_id',Auth::user()->company_id)->pluck('id')->first();
} else {
return 0;
}
}
public function getNationality(){
return ConfigCountry::where('country_code2',$this->nationality)->where('company_id',Auth::user()->company_id)->pluck('employee_code')->first();
}
// this function returns all validation errors after import:
public function getErrors()
{
return $this->errors;
}
public function rules(): array
{
return [
'employee_code' => [
'required','string','min:2','max:20',Rule::unique('hr_employees')->where(function ($query) {
return $query->where('company_id',Auth::user()->company_id);
})
],'first_name' => [
'required','min:3','max:50'
],'other_name' => [
'nullable','last_name' => [
'required','email' => [
'required','email',// official email
'max:100','line_manager_id' => 'nullable','gender_code' => 'nullable','department_id' => 'required','employee_type_id' => 'required','designation_id' => 'required','hr_status' => 'required',];
}
public function customValidationAttributes()
{
return [
'employee_code' => 'Staff ID','first_name' => 'First Name','other_name' => 'Middle Name','last_name' => 'Last Name','email' => 'Official Email','line_manager_id' => 'Line Manager','gender_code' => 'Gender','department_id' => 'Department','employee_type_id' => 'Employee Type','designation_id' => 'Designation','hr_status' => 'HR Status',];
}
public function validationMessages()
{
return [
];
}
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 batchSize(): int
{
return 200;
}
public function headingRow(): int
{
return 1;
}
}
然后我在控制器中有这个:
public function import(Request $request){
$request->validate([
'file' => 'required|max:10000|mimes:xlsx,xls',]);
$path1 = $request->file('file')->store('temp');
$path=storage_path('app').'/'.$path1;
try{
Excel::import(new EmployeesImport,$path);
} catch (\Maatwebsite\Excel\Validators\ValidationException $e) {
$failures = $e->failures();
$all_errors = $e->errors();
Log::error($failures);
Log::error($all_errors);
Log::error($e);
$errormessage = "";
foreach ($failures as $failure) {
$errormess = "";
foreach($failure->errors() as $error)
{
$errormess = $errormess.$error;
}
$errormessage = $errormessage.",\n At Row ".$failure->row().",".$errormess."<br>";
}
// Session::flash('error','Excel file is not imported!');
Session::flash('error',$errormessage);
return back();
}catch (\Illuminate\Database\QueryException $e)
{
$errorCode = $e->errorInfo[1];
if($errorCode == 1062){
Log::error($e);
DB::rollback();
Session::flash('error','You have a duplicate entry problem!');
}
return back();
}
Session::flash('success','Employee Records Imported Successfully');
return redirect()->route('hr.employees.index');
}
问题是,当我尝试上传 excel 文件时,它表明它成功了。但是我发现数据库中没有数据。
我最终发现它无法识别:
Rule::unique('hr_employees')->where(function ($query) {
return $query->where('company_id',Auth::user()->company_id);
})
我用它来验证每个属性与 company_id 的唯一性
我该如何解决这个问题?
谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。