热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Yii20插入多条记录操作中,旧的属性值影响插入操作的原因

:本篇文章主要介绍了Yii20插入多条记录操作中,旧的属性值影响插入操作的原因,对于PHP教程有兴趣的同学可以参考一下。
我们在项目中有时会遇到插入和更新操作.

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) {
            //重点在这里: 我们需要每次都重新实例化对象,不然他就会出现上面的情况旧的属性存在,导致他们不认为是添加数据
              这里我采用的和上面的不一样,如果你有很多条数据,你传递到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表示上一条命令执行成功

以上就介绍了Yii20 插入多条记录操作中,旧的属性值影响插入操作的原因,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

推荐阅读
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了如何使用call_user_func_array函数向Redis中添加有序列表或集合。该函数可以接受一个数组作为参数,第一项是要操作的有序列表或集合的键,后续的项目是排序权重和值的交替。通过该函数,可以方便地向Redis中添加多个元素,并指定它们的排序权重。 ... [详细]
  • 本文介绍了在无法联网的情况下,通过下载rpm包离线安装zip和unzip的方法。详细介绍了如何搜索并下载合适的rpm包,以及如何使用rpm命令进行安装。 ... [详细]
author-avatar
名将箱包_714
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有