> 백엔드 개발 > PHP 튜토리얼 > Yii20 여러 레코드를 삽입하는 작업에서 이전 속성 값이 삽입 작업에 영향을 미치는 이유

Yii20 여러 레코드를 삽입하는 작업에서 이전 속성 값이 삽입 작업에 영향을 미치는 이유

WBOY
풀어 주다: 2016-07-29 08:56:54
원래의
1378명이 탐색했습니다.

때때로 프로젝트에서 삽입 및 업데이트 작업이 발생합니다.

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) {
  }
}
로그인 후 복사

첫 번째 레코드를 "삽입"하면 프로그램은 이 레코드를 이전 속성(Inside 위의 $_oldAttributes 속성)에 기록하고, 아래 두 번째 레코드를 "삽입"하면 프로그램은 객체의 $_oldAttributes 속성에 값이 있음을 확인하고(값에 관계없이) 이 레코드가 이미 존재한다는 사실을 기본값으로 설정하므로 "업데이트" 작업을 수행하지만 현재는 수행합니다. 목표는 프로그램이 "삽입" 작업을 수행하도록 하는 것입니다. 어떻게 하면 "업데이트"할 수 있습니까? 따라서 이번에는 $_oldAttributes를 지울 때마다 $this->setOldAttributes(null) 메서드를 사용합니다. , 그런 다음 나중에 새 레코드가 "삽입"되면 프로그램은 $_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);

    }
로그인 후 복사

보충:

오늘은 명령줄에 다음을 입력할 수 있다는 것을 배웠습니다: echo $? 마지막 명령 실행의 상태(코드)를 표시합니다

0은 이전 명령이 성공적으로 실행되었음을 의미합니다

위 내용은 Yii20에서 여러 레코드를 삽입할 때 이전 속성 값이 삽입 작업에 영향을 미치는 이유를 관련 측면을 포함하여 소개하고 있으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿