Feb 3, 2021
0
Level 9
Rules Requests causing issues in Laravel Maatwebsites Excel upload
I am using Maatwebsites-3.1 in Laravel-5.8 for Excel upload. This is shown below:
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
class EmployeesImport implements WithMultipleSheets
{
public function sheets(): array
{
return [
new FirstEmployeeSheetImport()
];
}
}
The function above is used to call the one shown below:
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',
'string',
'min:3',
'max:50'
],
'other_name' => [
'nullable',
'string',
'max:50'
],
'last_name' => [
'required',
'string',
'min:3',
'max:50'
],
'email' => [
'required',
'email', // official email
'max:100',
Rule::unique('hr_employees')->where(function ($query) {
return $query->where('company_id', Auth::user()->company_id);
})
],
'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;
}
}
Then I have this in the controller:
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');
}
The problem is that, When I tried t upload the excel file it shows that it was successful. But I found that no data is store in the database.
I eventually found that it's not recognising:
Rule::unique('hr_employees')->where(function ($query) {
return $query->where('company_id', Auth::user()->company_id);
})
and I'm using it to validate the uniqueness of each attribute with company_id
How do I resolve this issues?
Thank you
Please or to participate in this conversation.