我正在尝试通过csv文件将学生数量上传到数据库。我能够将数据库上传到csv文件,但它只将第一个学生上传到数据库而不是其他人。对于出了什么问题的任何想法?
将csv文件上传到数据库的函数:
function csvstudents(Request $req) {
if ($req->hasFile('csvfile')) {
$path = $req->file('csvfile')->getRealPath();
$data = \Excel::load($path)->get();
if ($data->count()) {
foreach ($data as $key => $value) {
$arr = [
'studentID' => $value->studentID,
'name' => $value->name,
'var1' => $value->var1,
'var2' => $value->var2,
'email' => $value->email,
'address1' => $value->address1,
'c1' => $value->c1,
'c2' => $value->c2,
'c3' => $value->c3,
'c4' => $value->c4,
'c5' => $value->c5,
'c6' => $value->c6,
'c7' => $value->c7,
'c8' => $value->c8,
'c9' => $value->c9,
'c10' => $value->c10,
];
}
if (!empty($arr)) {
DB::table('students')->insert($arr);
return "Success";
}
}
}
}
测试CSV文件:
9 Katy Perry A* WellDone! katy@hotmail.com 91 Fromans Road, Moseley, Birmingham, B94TJ 4 4 5 6 7 6 5 4 2 2
10 chut winder A* WellDone! katy@hotmail.com 92 Fromans Road, Moseley, Birmingham, B94TJ 4 4 5 6 7 6 5 4 2 2
11 Test A* WellDone! katy@hotmail.com 93 Fromans Road, Moseley, Birmingham, B94TJ 4 4 5 6 7 6 5 4 2 2
所以如果我上传测试数据库,它只会将第一个学生插入数据库,我想上传所有3个条目。
答案 0 :(得分:1)
您需要插入循环内部或推送到$arr
并插入循环外部
内部循环
if ($data->count()) {
foreach ($data as $key => $value) {
$arr = ['studentID' => $value->studentID,
'name' => $value->name,
'var1' => $value->var1,
'var2' => $value->var2,
...
];
DB::table('students')->insert($arr);
}
return "Success";
}
外部循环
if ($data->count()) {
$arr = [];
foreach ($data as $key => $value) {
$arr[] = ['studentID' => $value->studentID,
'name' => $value->name,
'var1' => $value->var1,
'var2' => $value->var2,
...
];
}
if (! empty($arr)) {
DB::table('students')->insert($arr);
return "Success";
}
}
答案 1 :(得分:0)
您没有在$arr
中添加新值,而是在每次迭代时覆盖它:
foreach ($data as $key => $value) {
$arr = ['studentID' => $value->studentID,
你可能想要这个:
$arr = [];
foreach ($data as $key => $value) {
$arr[] = ['studentID' => $value->studentID,
这假定您的insert()
方法可以采用数组。如果情况并非如此,那么您可以按原样保留数组,只需在循环中添加对insert()
的调用。