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 相关文章推荐
如何开发一个虚拟域名系统
Oct 09 PHP
PHP Pear 安装及使用
Mar 19 PHP
php adodb分页实现代码
Mar 19 PHP
php PDO中文乱码解决办法
Jul 20 PHP
PHP中实现中文字符进制转换原理分析
Dec 06 PHP
浅谈apache和nginx的rewrite的区别
Feb 22 PHP
PHP生成自适应大小的缩略图类及使用方法分享
May 06 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
Nov 24 PHP
php中mt_rand()随机数函数用法
Nov 24 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
Jan 09 PHP
无需数据库在线投票调查php代码
Jul 20 PHP
Laravel实现批量更新多条数据
Apr 06 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
PHP Pear 安装及使用
2009/03/19 PHP
php 网页游戏开发入门教程一(webgame+design)
2009/10/26 PHP
PHP session文件独占锁引起阻塞问题解决方法
2015/05/12 PHP
手把手编写PHP框架 深入了解MVC运行流程
2016/09/19 PHP
php多线程并发实现方法
2016/09/30 PHP
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
IE6中使用position导致页面变形的解决方案(js代码)
2011/01/09 Javascript
JS检测图片大小的实例
2013/08/21 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
javascript中的if语句使用介绍
2013/11/20 Javascript
JS在onclientclick里如何控制onclick的执行
2016/05/30 Javascript
KVM虚拟化技术之使用Qemu-kvm创建和管理虚拟机的方法
2016/10/05 Javascript
javascript ES6 新增了let命令使用介绍
2017/07/07 Javascript
Angular实现的简单定时器功能示例
2017/12/28 Javascript
JS实现导出Excel的五种方法详解【附源码下载】
2018/03/15 Javascript
一次微信小程序内地图的使用实战记录
2019/09/09 Javascript
[43:41]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
python实现将pvr格式转换成pvr.ccz的方法
2015/04/28 Python
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
python内打印变量之%和f的实例
2020/02/19 Python
python openCV实现摄像头获取人脸图片
2020/08/20 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
使用Html5 Stream开发实时监控系统
2020/06/02 HTML / CSS
百思买加拿大:Best Buy Canada
2018/03/20 全球购物
美国学校用品、教室和教学商店:Discount School Supply
2018/04/04 全球购物
罗技英国官方网站:Logitech UK
2020/11/03 全球购物
什么是Assembly(程序集)
2014/09/14 面试题
Java程序员综合测试题
2014/04/25 面试题
欢迎领导检查标语
2014/06/27 职场文书
2014年反腐倡廉工作总结
2014/12/05 职场文书
委托收款证明
2015/06/23 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
导游词之天津盘山
2019/11/01 职场文书
vue实现同时设置多个倒计时
2021/05/20 Vue.js