如何使用 Eloquent 批量方法执行 updateOrCreate 方法

我有一个1w条的数组,需要实现批量插入或修改数据库的操作,难道只能在 foreach 循环中使用 updateOrCreate 方法吗?

foreach ($dataList as $key => $item) {
        $model = new Model();
        $model::query()->updateOrCreate([
            's_id' => $item['s_id'],
        ], $item);
}

有没有办法实现类似批量插入那样的方法?
————————————分割线——————————————————
题主尝试了几个不同的方案
1.开 pcntl_fork 多进程并发请求 ,不过这个方案可能会造成mysql io被打满,比较粗暴,需要添加sleep时间

    $pid = pcntl_fork();
    if ($pid == -1) {
        //错误处理:创建子进程失败时返回-1.
        die('could not fork');
    } else if ($pid) {
        //父进程会得到子进程号,所以这里是父进程执行的逻辑
//                    pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
        $this->masterList[] = $pid;
    } else {
        // todo something!
        $this_pid = getmypid();
        Log::info("完成!$this_pid");
        exit(1);
    }
    // 循环外添加
    $this->waitPid();

public function waitPid() {
  foreach ($this->masterList as $pid) {
     pcntl_wait($pid);
  }
}
  1. 在model类中添加了拼接 replace into语句的方法 【目前采用这个方案】
    public function replace($dataList) {
        $keyList = array_keys(reset($dataList));
        $keyStr = implode(",", $keyList);
        $sql = "replace into " . $this->table . "($keyStr)" . " values";
        foreach ($dataList as $item) {
            $sql .= "('" . implode("','", array_values($item)) . "'),";
        }
        $sql = substr($sql, 0, -1);
        $res = DB::connection($this->connection)->insert($sql);
    }
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 10

好像没有哎,原生语句里有个replace insert,不过判断条件必须是主键,不知道能不能适用你的情况

5年前 评论

insert支持数据数组插入

doc

5年前 评论

@Kamicloud 不只是insert操作,是 updateOrCreate 操作

5年前 评论

迁移场景下直接写sql比较好,不是迁移场景可以考虑写sql,但是写得好看些

5年前 评论
sreio

REPLACE INTO语句,你可以看看是否适合你, 不一定适合。

5年前 评论

我也是有海量的数据需要更新或插入, 楼主有找到好的方案吗?

5年前 评论
默默晴天 (楼主) 5年前
liuyong (作者) 5年前

有解决吗?同求呢。

5年前 评论
liuyong 5年前

建议不使用updateOrCreate
使用 集合处理数组 找出所有带有id 的进行更新 然后所有没有id 的进行插入操作

5年前 评论
waney 5年前
PhoenixIcy (作者) 5年前
waney 5年前
PhoenixIcy (作者) 5年前
waney 5年前

批量更新时可以使用 mysql 的 ‘case when’ 语句进行处理,这个可以自己去封装。

5年前 评论
liuyong 5年前
香克斯啊

不知道这篇文章用的上不 刚刚看到的
laravel分享一个根据主键进行批量更新的方法

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!