如何使用 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);
    }
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 11

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

3个月前 评论

insert支持数据数组插入

doc

3个月前 评论

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

3个月前 评论

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

3个月前 评论

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

3个月前 评论

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

1个月前 评论
默默晴天 (楼主) 1个月前
liuyong (作者) 21小时前

有解决吗?同求呢。

1周前 评论
liuyong 21小时前

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

1周前 评论
waney 1周前
PhoenixIcy (作者) 1周前
waney 1周前
PhoenixIcy (作者) 1周前
waney 1周前

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

1周前 评论
liuyong 21小时前
香克斯啊

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

1周前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!