2018-07-04 08:29:49 2070次浏览 4条回答 0 悬赏 10 金钱
$arr = [
    ['id' => 1, 'name' => 'test1', 'mobile' => '13111111111'],
    ['id' => 2, 'name' => 'test2', 'mobile' => '13111111112'],
    ['id' => 0, 'name' => 'test3', 'mobile' => '13111111113'],
    ['id' => 0, 'name' => 'test4', 'mobile' => '13111111114'],
];

假设现有如上数组,若id非0则修改原有数据,若id为0则新增数据,各位大神是如何操作的,循环内查询?

  • 回答于 2018-07-04 09:03 举报

    批量操作,循环数组,分2个数组,一个新增,一个更新,新增就是一个一个添加.更新就是用批量更新.betchinsert

    7 条回复
    回复于 2018-07-04 10:19 回复

    batchInsert,是用来批量插入的吧?

    回复于 2018-07-04 17:02 回复

    这情况没有批量更新这种操作(批量更新前提是更新的字段设置的值一样,而这里多个值都需要更改),这里只能batchInsert批量新增,如果你数据库只有name和mobile这2个字段,循环操作,单个更新速度是很慢的,建议先删除,再所有的数组批量插入,但也要分批插入,一次批量插入条数不易太多(比如500或1000条),不然会超过允许执行的数据包max_allowed_packet

    回复于 2018-07-05 10:44 回复

    先删除,在添加,这样数据量操作太大了,id增长也太快了。我感觉弄个异步会好些,没有添加,有的更新

    回复于 2018-07-05 11:28 回复

    除了主键增加,没有其他不当之处,当你做过上w条以上的excel数据导入,然后数据更新你就知道了,单个更新慢死你,(这里只能做批量删除和批量新增的操作)当然如果就想按正常的思维做要应对大量的数据,这处理就必须得队列来执行了,
    如果只是很少量的数据,当然直接循环时判断id为0就新增$model = new Model();,不为0就更新了$model = Model()::findOne($id);

    回复于 2018-07-05 11:35 回复

    先删除,再添加是个方法,但是满足不了某些场景,比如id存在关联的情况,队列倒是可以考虑,

    回复于 2018-07-05 11:40 回复

    用队列把,异步执行

    回复于 2018-07-05 11:41 回复

    确实,单个更新数据少还好,一多卡的要死

  • 回答于 2018-07-05 09:27 举报

    代码都给你写好了

    foreach ($data as $val){
        $model = Model::find()->where(['id'=>$val['id']]);
        if (!$model){
            $model = new Model();
        }
        $model->name = $val['name'];
        $model->mobile = $val['mobile'];
        $model->save();
    }
    
    2 条回复
    回复于 2018-07-05 11:36 回复

    大哥你这样数据量大了会垮的,

    回复于 2018-07-05 14:53 回复

    批量添加 数据量大 可以考虑分批量 一次插入N多条

  • 回答于 2018-07-05 14:56 举报

    我理解的是先循环数组 把需要更新的新增的数据区分开来 更新的数据只能一条一条来 新增额就能实现批量新增

    2 条回复
    回复于 2018-07-05 15:01 回复

    嗯,数据量少是用这种方法;抛出这个问题就是想看看各位大神有没有更好的方法,多学习学习!嘿嘿

    回复于 2018-07-06 09:48 回复

    没问题,就改成已解决把

  • 回答于 2018-07-12 15:20 举报

    betchInsert ,标记,随后用,谢谢分享

您需要登录后才可以回答。登录 | 立即注册
lpinecn
职场新人

lpinecn

注册时间:2018-07-03
最后登录:2018-08-10
在线时长:0小时45分
  • 粉丝0
  • 金钱60
  • 威望0
  • 积分60

热门问题