关于批量插入数据的问题

要实现的功能:批量创建用户。

我目前的做法:foreach循环,在循环里把符合条件的用insertGetId方法插入用户表并获得用户id,然后把用户id再插入到用户角色表里。

目前遇到的问题:时间过长,一个foreach循环耗时大概0.1左右,单单100条数据就得10秒钟,别提成千上万条数据了。使用事务没有明显效果

DB::beginTransaction();
        try{
            foreach($excel as $k => $v){
                $val = array();
                //中间省略判断代码
                $val['username'] = $v['name'];
                //...
                if($id = $this->insertGetId($val)){
                    if($role = DB::table('user_role')->insert(['user_id' => $id, 'role_id' => 3])){//3代表默认角色
                    }else{
                        $v[6] = '创建失败';
                        $err[] = $v;
                        User::destroy($id);
                    }
                }else{
                    $v[6] = '创建失败';
                    $err[] = $v;
                }
            }
            DB::commit();
        } catch (Exception $ex) {
            DB::rollBack();
        }<br></br>

我估计应该是思路性问题,本人菜鸟一个,大概laravel框架里有更好的方法我不知道而已

snail

insert 有拼装语句的,insert into table values(1),(2),(3)
1000万条数据,1000条数据拼装下, 只需要insert 1万次
另外一个,可以使用多进程

ljm5889

@snail 多谢,1000条大概从150秒减少到58秒,我每一行代码都打印了一下耗费时间,问题出现在bcrypt()这个方法里,我是用的它加密原始密码,换成md5()方法后,从58秒缩短到2秒。

我现在困惑的地方在这里,我需要获得插入users表成功的id,然后把这些id再插入到中间表user_role表里,this->insertGetId()方法可以获得id但只能一条一条插入,效率慢,this->insert($data)方法返回不了id值

我目前的做法:先获取users表最大自增id,插入users后查询获得大于此自增ID的数据,然后插入到user_role里
maxid=User::select(id)>orderBy(id,desc)>first()>id;if(maxid = User::select('id')->orderBy('id', 'desc')->first()->id; if(this->insert($data)){//插入用户表
$user_id = $this->select(‘id as user_id’)->where(‘id’, ‘>’, $maxid)->get()->toArray();//获得成功插入的用户id
result=DB::table(userrole)>insert(result = DB::table('user_role')->insert(user_id);//插入用户角色表
}

snail

@ljm5889 这个可以使用mysql的触发器,laravel也有event可以支持

ljm5889

@snail 好的,我研究一下文档,看看如何实现