我正在编写一个类来处理从CSV文件导入本地数据库的数据。其目的是从我们的电子邮件平台拉进电子邮件发送报告,并更新我们的本地数据库与每一封电子邮件的最新状态。
我目前正在逐行解析CSV,并将每一行推入下面的函数中。
private function intoDB($id,$data,$schema,$chunk = 500) {
if(!isset($this->emails)) {
$this->emails = [];
}
$email = [];
foreach($schema as $key => $value) {
$email[$value] = $data[$key];
}
$email['created_at'] = new \DateTime;
$email['updated_at'] = $email['created_at'];
$this->emails[] = $email;
if(count($this->emails) > $chunk) {
\Email::insert($this->emails);
$this->emails = [];
}
}
$schema变量将CSV列匹配到表字段,如下所示:
$schema = [
1 => 'campign_id',
2 => 'email'
];
这对于插入从未见过的新数据非常有效,但是,如果一样的活动_id和电子邮件的组合已经存在,就需要更新行。我知道可以用First OrNew(),但这导致了以下错误:
Column not found: 1054 Unknown column '0' in 'where clause' (SQL: select * from `emails` where (`0` = 59 and `1` = xxx@xxx.com
我认为这是因为在保存数据之前我没有创建模型(一个一个地保存数据太慢了)。
有什么建议吗?