doufan3958 2014-11-14 17:28
浏览 719

Laravel Eloquent批量插入或更新出错!

我正在编写一个类来处理从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

我认为这是因为在保存数据之前我没有创建模型(一个一个地保存数据太慢了)。

有什么建议吗?

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 微信会员卡等级和折扣规则
    • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
    • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
    • ¥15 gdf格式的脑电数据如何处理matlab
    • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
    • ¥100 监控抖音用户作品更新可以微信公众号提醒
    • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
    • ¥70 2048小游戏毕设项目
    • ¥20 mysql架构,按照姓名分表
    • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分