Нужно загрузить CSV-файл, чтобы получить все строки, но в настоящее время выборка первой строки

Это код функции загрузки в моем контроллере. Проблема в том, что когда я загружаю файл csv в свою базу данных, я получаю (выбираю) только первую строку файла, а остальные строки опускаются. Мне нужно чтобы иметь возможность получить все строки из файла. Пожалуйста, помогите в любом случае вы можете … Заранее спасибо

public function upload(Request $request)
{
//get file
//$allowed =  array('csv');
$upload=$request->file('upload');
//$extension = File::extension($upload);
$filePath=$upload->getRealPath();//open and read
$file=fopen($filePath,'r');
$header= fgetcsv($file);
$escapedHeader=[];

//validate
foreach ($header as $key => $value) {

$lheader= strtolower($value);
$escapedItem=preg_replace('/[^a-z]/', '', $lheader);

array_push($escapedHeader, $escapedItem);

}
//looping throught other columns

while ($columns=fgetcsv($file)) {

if ($columns[0]=="")
{
continue;
}

$data= array_combine($escapedHeader, $columns);
dd($data);
//setting type

foreach ($data as $key => $value) {
$value=($key=="phone" || $key=="nationalid" || $key=="staffsalary")?(integer)$value:(string)$value;
}

//table update
$firstname=$data['firstname'];
$lastname=$data['lastname'];
$email=$data['email'];
$phone=$data['phone'];
$nationalid=$data['nationalid'];
$staffid=$data['staffid'];
$stafftitle=$data['stafftitle'];
$staffsalary=$data['staffsalary'];$employees= Employees::firstOrNew(['phone'=>$phone,'nationalid'=>$nationalid]);
$employees->firstname=$firstname;
$employees->lastname=$lastname;
$employees->email=$email;
$employees->staff_id=$staffid;
$employees->staff_title=$stafftitle;
$employees->staff_salary=$staffsalary;
$employees->employer_phone = Auth::user()->phone;
$employees->save();

return redirect()->route('home');

}
}

0

Решение

Основная причина, по которой вы столкнулись с этой проблемой, заключается в том, что ваш return redirect()->route('home'); внутри вашего while петля. Просто переместите его так, чтобы он был снаружи, и он работал нормально.


Кроме того, это просто к сведению, но вы могли бы использовать Коллекции немного почистить контроллер, но:

public function upload(Request $request)
{
$upload = $request->file('upload');

$csv = collect(array_map('str_getcsv', file($upload->getRealPath())));

$keys = array_map(function ($item) {
return preg_replace('/[^a-z]/', '', strtolower($item));
}, $csv->shift());

$csv
->map(function ($row) use ($keys) {
return array_combine($keys, $row);
})
->reject(function ($row) {
return empty(array_first($row));
})
->each(function ($row) {

$row = array_map(function ($value, $key) {
return in_array($key, ['phone', 'nationalid', 'staffsalary']) ? (integer)$value : (string)$value;
}, $row);

$employees = Employees::firstOrNew(['phone' => $row['phone'], 'nationalid' => $row['nationalid']]);
$employees->firstname = $row['firstname'];
$employees->lastname = $row['lastname'];
$employees->email = $row['email'];
$employees->staff_id = $row['staffid'];
$employees->staff_title = $row['stafftitle'];
$employees->staff_salary = $row['staffsalary'];
$employees->employer_phone = Auth::user()->phone;
$employees->save();
});

return redirect()->route('home');
}

Очевидно, вам не нужно использовать приведенный выше код, я просто подумал, что покажу вам альтернативный способ его написания.

Я не был уверен, что if ($columns[0]=="") был там, но я добавил, что с reject() метод.

Надеюсь это поможет!

0

Другие решения

У вас другая проблема для разных ОС. Используйте эту конструкцию для лучшего:

    // take care of all possible newline-encodings in input file
$NEWLINE_RE = '/(\r\n)|\r|\n/';

$csv = preg_replace($NEWLINE_RE,'===BREAK===', $old_csv);
foreach (explode('===BREAK===', $csv) as $k => $line){
if(strlen($line) > 0) $lines[] = stripcslashes(trim($line));
}
0

По вопросам рекламы [email protected]