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 相关文章推荐
PHP大批量数据操作时临时调整内存与执行时间的方法
Apr 20 PHP
MySQL 日期时间函数常用总结
Jun 12 PHP
Linux下实现PHP多进程的方法分享
Aug 16 PHP
PHP简单选择排序算法实例
Jan 26 PHP
php身份证号码检查类实例
Jun 18 PHP
PHP对文件夹递归执行chmod命令的方法
Jun 19 PHP
php目录拷贝实现方法
Jul 10 PHP
PHP7+Nginx的配置与安装教程详解
May 10 PHP
PHP 应用容器化以及部署方法
Feb 12 PHP
PHP ADODB实现事务处理功能示例
May 25 PHP
php从数据库中获取数据用ajax传送到前台的方法
Aug 20 PHP
ThinkPHP5分页paginate代码实例解析
Nov 10 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之第五天
2006/10/09 PHP
生成php程序的php代码
2008/04/07 PHP
PHPLog php 程序调试追踪工具
2009/09/09 PHP
PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用
2012/05/07 PHP
php生成缩略图示例代码分享(使用gd库实现)
2014/01/20 PHP
php中filter_input函数用法分析
2014/11/15 PHP
如何使用PHP给图片加水印
2016/10/12 PHP
PHP判断函数是否被定义的方法
2019/06/21 PHP
javascript学习笔记(六) Date 日期类型
2012/06/19 Javascript
JS获取后台Cookies值的小例子
2013/03/04 Javascript
JS防止网页被嵌入iframe框架的方法分析
2016/09/13 Javascript
百度多文件异步上传控件webuploader基本用法解析
2016/11/07 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
2017/03/29 Javascript
JavaScript中offsetWidth的bug及解决方法
2017/05/17 Javascript
Popup弹出框添加数据实现方法
2017/10/27 Javascript
实例讲解javascript实现异步图片上传方法
2017/12/05 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
Vue 实现前端权限控制的示例代码
2019/07/09 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
Python实现八大排序算法
2016/08/13 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
用Python逐行分析文件方法
2019/01/28 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
2019/04/03 Python
使用Python实现将list中的每一项的首字母大写
2019/06/11 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
python实现读取类别频数数据画水平条形图案例
2020/04/24 Python
Python日志处理模块logging用法解析
2020/05/19 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
python如何支持并发方法详解
2020/07/25 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
matplotlib制作雷达图报错ValueError的实现
2021/01/05 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
产品质量承诺书范文
2014/03/27 职场文书
小学班主任自我评价
2015/03/11 职场文书
CSS3实现的3D隧道效果
2021/04/27 HTML / CSS