如何使用 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);
    }
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 10

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

4年前 评论

insert支持数据数组插入

doc

4年前 评论

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

4年前 评论

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

4年前 评论
sreio

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

4年前 评论

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

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

有解决吗?同求呢。

4年前 评论
liuyong 4年前

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

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

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

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

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

4年前 评论

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