Yii20 複数レコードの挿入操作において、古い属性値が挿入操作に影響を与える理由

WBOY
リリース: 2016-07-29 08:56:54
オリジナル
1299 人が閲覧しました

プロジェクトでは挿入操作や更新操作が発生することがあります。

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 であることを確認するため、当然のことながら新しいレコードを「挿入」する操作に従います

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);

    }
ログイン後にコピー
E

を追加しました:

今日、コマンド ラインに次のように入力できることがわかりました。 echo $ $ ? 表示されるのは、最後のコマンド実行のステータス (コード) です 0 は、最後のコマンドが正常に実行されたことを意味します


上記は、Yii20 で複数のレコードを挿入する際に古い属性値が挿入操作に影響を与える理由を、関連する側面も含めて紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!