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 相关文章推荐
Smarty+QUICKFORM小小演示
Feb 25 PHP
一篇不错的PHP基础学习笔记
Mar 18 PHP
php设计模式 Decorator(装饰模式)
Jun 26 PHP
解析PHP可变函数的经典用法
Jun 20 PHP
php去除头尾空格的2种方法
Mar 16 PHP
PHP输出九九乘法表代码实例
Mar 27 PHP
php对数组内元素进行随机调换的方法
May 12 PHP
PHP数据库操作二:memcache用法分析
Aug 16 PHP
php判断文件上传图片格式的实例详解
Sep 30 PHP
thinkPHP框架中执行事务的方法示例
May 31 PHP
PHP实现的敏感词过滤方法示例
Mar 06 PHP
PHP面向对象类型约束用法分析
Jun 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
PHP实现定时生成HTML网站首页实例代码
2008/11/20 PHP
php中函数的形参与实参的问题说明
2010/09/01 PHP
php中的boolean(布尔)类型详解
2013/10/28 PHP
php递归使用示例(php递归函数)
2014/02/14 PHP
Yii清理缓存的方法
2016/01/06 PHP
php实现用户注册密码的crypt加密
2017/06/08 PHP
jQuery中ajax的使用与缓存问题的解决方法
2013/12/19 Javascript
IE浏览器不支持getElementsByClassName的解决方法
2014/08/27 Javascript
jQuery中ajax的post()方法用法实例
2014/12/26 Javascript
javascript页面倒计时实例
2015/07/25 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
jquery使用on绑定a标签无效 只能用live解决
2016/06/02 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
2016/06/12 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
React根据宽度自适应高度的示例代码
2017/10/11 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
通过JavaScript下载文件到本地的方法(单文件)
2019/03/17 Javascript
对于Python装饰器使用的一些建议
2015/06/03 Python
Python采用Django开发自己的博客系统
2020/09/29 Python
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
解决Python二维数组赋值问题
2019/11/28 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
Pycharm中使用git进行合作开发的教程详解
2020/11/17 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
美国批发供应商:Kole Imports
2019/04/10 全球购物
Abbacino官网:包、钱包和女士配饰
2019/04/15 全球购物
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
工厂实习感言
2014/01/14 职场文书
淘宝好评语句大全
2014/12/31 职场文书
2015年卫生局工作总结
2015/07/24 职场文书
2020年基层司法所建设情况调研报告
2019/11/30 职场文书
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS
python中pycryto实现数据加密
2022/04/29 Python