我們在專案中有時會遇到插入和更新操作.
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 style="background-color: rgb(0, 153, 0);">/重点在这里</span>: 我们需要每次都重新实例化对象,不然他就会出现上面的情况旧的属性存在,导致他们不认为是添加数据 这里我采用的和上面的不一样,如果你有很多条数据,你传递到model中,需要遍历添加数据,这种情况你可以用上面的清空属性的方法来解决 <span style="color:#CC0000;">$mAccount = new Account(); $mHmcUser = new HmcUser();</span> <span style="color:#CC66CC;">之前我没把这两个对象放到遍历里面,而是放到了方法头部,导致了我添加数据不成功 ??这里一定要注意啊!!!</span> 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); }
補充:
?顯示的是上一條指令執行的狀態(碼)
0表示上一條指令執行成功
以上就介紹了Yii20 插入多筆記錄操作中,舊的屬性值影響插入操作的原因,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。