如何使用 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);
}
}
- 在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); }
好像没有哎,原生语句里有个replace insert,不过判断条件必须是主键,不知道能不能适用你的情况
insert支持数据数组插入
doc
@Kamicloud 不只是insert操作,是 updateOrCreate 操作
迁移场景下直接写sql比较好,不是迁移场景可以考虑写sql,但是写得好看些
REPLACE INTO语句,你可以看看是否适合你, 不一定适合。
我也是有海量的数据需要更新或插入, 楼主有找到好的方案吗?
有解决吗?同求呢。
建议不使用updateOrCreate
使用 集合处理数组 找出所有带有id 的进行更新 然后所有没有id 的进行插入操作
批量更新时可以使用 mysql 的 ‘case when’ 语句进行处理,这个可以自己去封装。
不知道这篇文章用的上不 刚刚看到的
laravel分享一个根据主键进行批量更新的方法