Yii框架批量插入数据扩展类的简单实现方法


Posted in PHP onMay 23, 2017

本文实例讲述了Yii框架批量插入数据扩展类的简单实现方法。分享给大家供大家参考,具体如下:

MySQL INSERT语句允许插入多行数据,如下所示:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

那么要实现批量插入,主要的任务就是按照列顺序,把数据组装成上述格式即可,可以使用sprintf和vsprintf函数来实现。

下面是一个实现批量插入的Yii扩展类的简单示例(支持VARCHAR类型数据):

<?php
/**
 * class for sql batch insert
 */
class CDbBICommand extends CDbCommand{
  /** @var CActiveRecord $class */
  private $class;
  /** @var string $insert_tpl */
  private $insert_tpl = "insert into %s(%s) ";
  /** @var string $value_tpl */
  private $value_tpl = "(%s)";
  /** @var string $query */
  public $query;
  /** @var CDbColumnSchema[] $columns */
  private $columns;
  /** @var boolean $fresh */
  private $fresh;
  /** @param CActiveRecord $class
   * @param CDbConnection $db
   */
  public function __construct($class,$db){
   $this->class = $class;
   $this->createtpl();
   parent::_construct($db);
  }
  private function createtpl(){
   $this->fresh = true;
   $value_tpl = "";
   $columns_string = "";
   $this->columns = $this->class->getMetaData()->tableSchema->columns;
   $counter = 0;
   foreach($this->columns as $column){
    /** @var CDbColumnSchema $column */
    if($column->autoIncrement){
     $value_tpl .= "0";
    }else{
     $value_tpl .= "\"%s\"";
    }
    $columns_string .= $column->name;
    $counter ++;
    if($counter != sizeof($this->columns)){
     $columns_string .= ", ";
     $value_tpl .= ", ";
    }
   }
   $this->insert_tpl = sprintf($this->insert_tpl, $this->class->tableName(), $columns_string);
   $this->value_tpl = sprintf($this->value_tpl, $value_tpl);
  }
  /**
   * @param CActiveRecord $record
   */
  public function add($record){
   $values = array();
   $i = 0;
   foreach($this->columns as $column){
    if($column->autoIncrement){
     continue;
    }
    $values[$i] = $this->class->{$column->name};
    $i ++;
   }
   if(!$this->fresh){
    $this->query .= ",";
   }else{
    $this->query = "values";
   }
   $this->fresh = false;
   $this->query .= vsprintf($this->value_tpl, $values);
   return true;
  }
  public function execute(){
   $this->setText($this->insert_tpl." ".$this->query);
   return parent::execute();
  }
}

使用方法是通过add方法逐个加入数据,然后调用execute执行。

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

PHP 相关文章推荐
IIS下PHP连接数据库提示mysql undefined function mysql_connect()
Jun 04 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
Jun 17 PHP
php数组去重的函数代码
Feb 03 PHP
深入php中var_dump方法的使用详解
Jun 24 PHP
Codeigniter实现处理用户登录验证后的URL跳转
Jun 12 PHP
PHP定时任务延缓执行的实现
Oct 08 PHP
php+ajax实现无刷新动态加载数据技术
Apr 28 PHP
Zend Framework缓存Cache用法简单实例
Mar 19 PHP
PHP框架laravel的.env文件配置教程
Jun 07 PHP
PHP双向链表定义与用法示例
Jan 31 PHP
php学习笔记之字符串常见操作总结
Jul 16 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
May 12 PHP
php利用fsockopen GET/POST提交表单及上传文件
May 22 #PHP
PHP简单实现遍历目录下特定文件的方法小结
May 22 #PHP
PHP编程计算文件或数组中单词出现频率的方法
May 22 #PHP
Yii2框架中日志的使用方法分析
May 22 #PHP
浅谈PHP面向对象之访问者模式+组合模式
May 22 #PHP
php readfile下载大文件失败的解决方法
May 22 #PHP
老生常谈PHP 文件写入和读取(必看篇)
May 22 #PHP
You might like
关于手调机和数调机的选择
2021/03/02 无线电
PHP网站提速三大“软”招
2006/10/09 PHP
php SQL之where语句生成器
2009/03/24 PHP
php 更新数据库中断的解决方法
2009/06/05 PHP
PHP form 表单传参明细研究
2009/07/17 PHP
php在页面中调用fckeditor编辑器的方法
2011/06/10 PHP
PHP中将数组转成XML格式的实现代码
2011/08/08 PHP
PHP简单判断字符串是否包含另一个字符串的方法
2016/03/25 PHP
PHP转换文本框内容为HTML格式的方法
2016/07/20 PHP
Laravel框架中缓存的使用方法分析
2019/09/06 PHP
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
jQuery 属性选择器element[herf*='value']使用示例
2013/10/20 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
jquery使整个div区域可以点击的方法
2015/06/24 Javascript
详解JavaScript ES6中的模板字符串
2015/07/28 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
2016/07/21 Javascript
初探nodeJS
2017/01/24 NodeJs
js for循环倒序输出数组元素的实例
2017/03/01 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
python 统计代码行数简单实例
2017/05/04 Python
python3使用smtplib实现发送邮件功能
2018/05/22 Python
python实现图片识别汽车功能
2018/11/30 Python
python 多线程对post请求服务器测试并发的方法
2019/06/13 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
JS原生实现轮播图的几种方法
2021/03/23 Javascript
求职自荐信格式
2013/12/04 职场文书
化工实习心得体会
2014/09/09 职场文书
公司规章制度范本
2015/08/03 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS