通过csv

时间:2018-04-19 16:42:28

标签: php sql laravel csv file-upload

我正在尝试通过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个条目。

2 个答案:

答案 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()的调用。