doufan3958 2014-11-14 17:28 采纳率: 0%
浏览 726

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

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

有什么建议吗?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-03 02:39
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在 Laravel 中,你可以使用 Eloquent 的 Eloquent::update() 方法来更新已存在的记录。这个方法接受两个参数:第一个是你的关联模型实例,第二个是要更新的条件(即要找到的行)。例如:

    $email = Email::find($id);
    
    if ($email) {
        $email->update([
            'status' => $newStatus,
        ]);
    } else {
        // 如果找不到对应的记录,可以在这里添加新的记录
    }
    

    这样你就不需要逐行解析 CSV 文件并检查是否存在重复的记录,而是直接通过 ID 找到相应的记录进行更新。这种方法的优点是可以提高性能,因为不需要遍历整个数组来查找重复项。

    评论

报告相同问题?