Yii2.0 插入多条记录操作中,旧的属性值影响插入操作的原因
来源:互联网 发布:conoha绑定域名 编辑:程序博客网 时间:2024/06/14 06:56
我们在项目中有时会遇到插入和更新操作.
1: 对于更新来说:因为如果你使用$this->setOldAttributes(null);,那么代表清空了它原来的记录,它将默认为原来的旧属性不存在,那么他认为现在的这条记录是新的,所以它将进行插入操作,故我们不能将 它的旧属性清空.
2: 对于插入来说:
我在插入操作中打印$this,它返回给我这样的结果:
private $_attributes => //这次现在的这条属性 array(7) { 'app_id' => string(6) "100000" 'hour' => string(2) "21" 'stat_day' => string(10) "2015-07-13" 'total' => int(1) 'id' => string(16) "1000002015071321" 'create_time' => int(1449326053) 'update_time' => int(1449326053) } private $_oldAttributes => //此时,它将旧的属性给与了此时的值 array(7) { 'app_id' => string(6) "100000" 'hour' => string(2) "21" 'stat_day' => string(10) "2015-07-13" 'total' => int(1) 'id' => string(16) "1000002015071321" 'create_time' => int(1449326053) 'update_time' => int(1449326053) } private $_related => array(0) { } private $_errors => array(0) { } private $_validators => class ArrayObject#48 (1) { private $storage => array(0) { } } private $_scenario => string(7) "default" private $_events => array(0) { } private $_behaviors => array(0) { }}
当我们"插入"第一条记录的时候, 程序会将此时的这条记录, 记录到旧属性里面, 也就是上面的$_oldAttributes属性里面, 那么我们下面"插入"第2条记录的时候, 程序查看到对象中$_oldAttributes属性中有值(不管他是什么值), 都默认为此记录已经存在,所以它将进行"更新"操作, 但是我们现在目的是让程序进行"插入"操作啊, 怎么能让它"更新"那,所以此时我们在每次"插入"的时候, 使用$this->setOldAttributes(null)方式, 将$_oldAttributes清空一下, 那么任何时候, 后面再"插入"新纪录的时候,程序查看$_oldAttributes属性为null, 所以自然而然的就按照我们的操作去"插入"新的记录了啊!!
我们使用了$this->setOldAttributes(null); 来清空旧的属性, 让下面需要新的记录插入进去.
现在我项目中的例子:
public function actionOfflineUserImport() { $mTempUser = new TempUser(); //取出学霸表中的所有的用户信息 $tempUsers = $mTempUser->find()->select('mobile, truename, weixin, corp, position')->asArray()->all(); if (!$tempUsers) { echo "无用户需要同步\n"; exit(2); } // 遍历所有的用户信息,并将每一项插入到另一个数据库中表中 foreach ($tempUsers as $key => $values) { //重点在这里</span>: 我们需要每次都重新实例化对象,不然他就会出现上面的情况旧的属性存在,导致他们不认为是添加数据 这里我采用的和上面的不一样,如果你有很多条数据,你传递到model中,需要遍历添加数据,这种情况你可以用上面的清空属性的方法来解决 $mAccount = new Account(); $mHmcUser = new HmcUser(); 之前我没把这两个对象放到遍历里面,而是放到了方法头部,导致了我添加数据不成功 ??这里一定要注意啊!!! if (!isset($values['mobile']) || !$values['mobile']) { echo "手机号码不存在\n"; exit(3); } $mobile = $values['mobile']; $isMobile = $mAccount->isExistMobile($mobile); if (!$isMobile) { try { $key = 'user:id:pool'; $cache = Yii::$app->cache->instance('base'); if (!($cache->lpop($key))) { echo "获取用户ID失败\n"; exit(4); } else { $values['user_id'] = $cache->lpop($key); } } catch (\Exception $e) { echo "连接redis服务器失败,请稍后重试\n"; exit(5); } $data['user_id'] = $values['user_id']; $data['mobile'] = $values['mobile']; $accountData = $mAccount->addCrm($data, $status = Account::STATUS_UNINIT); $usersData = $mHmcUser->add($values); if (!$accountData) { echo $mobile . "同步account表 => 失败\n"; } else { echo $mobile . "同步account表 => 成功\n"; } if (!$usersData) { echo $mobile . "同步到 user表 => 失败\n"; } else { echo $mobile . "同步到 user表 => 成功\n"; } } } exit(0); }
总结: 当你碰到插入多条记录的时候,一定要慎重啊,一定要考虑旧的属性值得问题!
补充:
今天刚知道一个在命令行下可以输入: echo $? 显示的是上一条命令执行的状态(码)
0表示上一条命令执行成功
- Yii2.0 插入多条记录操作中,旧的属性值影响插入操作的原因
- 一次插入多条记录,mysql与SQLServer的不同操作
- Gridview控件中,实现插入新记录的操作(footer)
- (2)Mysql 一次性insert 20000或更多个value。其中N条执行出错,则记录错误原因。没错的正常执行插入操作。
- MySQL基本操作(六):建表,插入多条记录,更新表中特定数据
- Oracle 插入多条记录的sql
- hive的插入操作
- 数据结构的插入操作
- map的插入操作
- 单链表的插入操作
- 红黑树的插入操作
- vector的插入操作
- 单链表的插入操作
- RBTree的插入操作
- SQL的插入操作
- oracle过程中取得更新操作影响的记录条数
- 向表中插入多条记录
- Oracle千万条记录插入与查询操作小结
- 由浅到深理解MySql数据库
- 规范完整APP开发制作流程
- java transient简介
- hud1875
- JAVA多线程之高级部分
- Yii2.0 插入多条记录操作中,旧的属性值影响插入操作的原因
- 一个国外博士生Andrews Sobral收集和测试的64个低秩+稀疏矩阵/张量分解的算法库
- 二维有序矩阵的查找
- 【HPU】[1735]老王修马路(一)
- 2015 UESTC Training for Dynamic Programming N - 导弹拦截 LIS nlog(n)+打印字典序最小的路径
- 字符编码笔记:ASCII,Unicode和UTF-8
- Windows下80端口被进程System&PID=4占用
- POJ 2653 Pick-up sticks【计算几何入门】
- if与switch的小区别