情况:数组索引是正确的。dd($row[5](显示了记录中的"电子邮件地址"-工作正常。
然而,当将其分配给对象的电子邮件字段时,Laravel显示:ErrorException-未定义的偏移量:5
这是我的代码:
$file = $request->file('file');
$csvData = file_get_contents($file);
$rows = array_map('str_getcsv', explode("n", $csvData));
foreach ($rows as $row) {
//dd($row[5]); // shows me email
$subscriber = new Subscriber;
$subscriber->email = $row[5]; // Shows: ErrorException - Undefined offset: 5
$subscriber->first_name = $row[3];
$subscriber->save();
}
这是ddd($row(
array:7 [▼
0 => "1"
1 => "2019-02-27 01:01:52"
2 => "mailchimp"
3 => "Name"
4 => "Lastname"
5 => "fake-subscriber@gmail.com"
6 => "EN"
]
有什么想法吗?
-
dd()
将打印消息。和exit()
,所以您只需在第一个循环打印即可。它可以在第二个循环中没有索引5。 -
不要在每个循环中
save()
条记录,这会在数据库中花费更多的成本时间;尝试将它们放入数组中,然后立即插入。 -
如果您不想在没有电子邮件的情况下保存这些记录,只需检查行,不要将其放入数组中。
PS:如果您想在一条记录失败时回滚,请尝试使用transaction
你的代码应该是这样的:
$file = $request->file('file');
$csvData = file_get_contents($file);
$rows = array_map('str_getcsv', explode("n", $csvData));
$arr = array();
// dd($row) // Here you can see the rows which without index 5.
foreach ($rows as $row) {
$sub = [];
$sub['email'] = isset($row[5])? $row[5]: '';
$sub['first_name'] = isset($row[3])? $row[3]: '';
$arr []= $sub;
}
Subscriber::insert($arr);
或
$arr = array();
foreach ($rows as $row) {
$sub = [];
if (count($row) > 5) {
$sub['email'] = $row[5];
$sub['first_name'] = $row[3];
$arr []= $sub;
}
}
Subscriber::insert($arr);