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 动态多文件上传
Jan 18 PHP
UCenter中的一个可逆加密函数authcode函数代码
Jul 20 PHP
PHP自动识别字符集并完成转码详解
Aug 02 PHP
php返回json数据函数实例
Oct 09 PHP
php绘制一个矩形的方法
Jan 24 PHP
Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
Mar 07 PHP
php生成图片验证码的方法
Apr 15 PHP
php构造函数与析构函数
Apr 23 PHP
PHP文件操作详解
Dec 30 PHP
Laravel学习教程之request validation的编写
Oct 25 PHP
PHP实现的一致性Hash算法详解【分布式算法】
Mar 31 PHP
实例讲解PHP验证邮箱是否合格
Jan 28 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
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
2014/08/08 PHP
用PHP的反射实现委托模式的讲解
2019/03/22 PHP
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
javascript对数组的常用操作代码 数组方法总汇
2011/01/27 Javascript
动态加载js和css(外部文件)
2013/04/17 Javascript
Javascript改变CSS样式(局部和全局)
2013/12/18 Javascript
Javascript中的方法链(Method Chaining)介绍
2015/03/15 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
实例代码讲解jquery easyui动态tab页
2015/11/17 Javascript
AngularJs定时器$interval 和 $timeout详解
2017/05/25 Javascript
微信小程序实现轮播图效果
2017/09/07 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
JavaScript前端页面搜索功能案例【基于jQuery】
2019/07/10 jQuery
javascript实现简单打字游戏
2019/10/29 Javascript
[18:20]DOTA2 HEROS教学视频教你分分钟做大人-昆卡
2014/06/11 DOTA
python操作ie登陆土豆网的方法
2015/05/09 Python
Python简单计算文件夹大小的方法
2015/07/14 Python
python如何定义带参数的装饰器
2018/03/20 Python
python爬虫爬取微博评论案例详解
2019/03/27 Python
python 计算数据偏差和峰度的方法
2019/06/29 Python
信号生成及DFT的python实现方式
2020/02/25 Python
Django自定义全局403、404、500错误页面的示例代码
2020/03/08 Python
用python进行视频剪辑
2020/11/02 Python
Nordgreen英国官网:斯堪的纳维亚设计师手表
2018/10/24 全球购物
优衣库台湾官网:UNIQLO台湾
2019/02/01 全球购物
如何在.net Winform里面显示PDF文档
2012/09/11 面试题
大学军训感言400字
2014/03/11 职场文书
三方合作协议书范本
2014/04/18 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
出纳工作检讨书
2014/10/18 职场文书
确保工程质量承诺书
2015/04/29 职场文书
经典祝酒词大全
2015/08/12 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL