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执行速度全攻略
Oct 09 PHP
PHP下10件你也许并不了解的事情
Sep 11 PHP
PHP的autoload机制的实现解析
Sep 15 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
Aug 01 PHP
PHP删除数组中空值的方法介绍
Apr 14 PHP
PHP获取POST数据的几种方法汇总
Mar 03 PHP
10款PHP开源商城系统汇总介绍
Jul 23 PHP
PHP常用的排序和查找算法
Aug 06 PHP
解读PHP的Yii框架中请求与响应的处理流程
Mar 17 PHP
Yii 2.0自带的验证码使用经验分享
Jun 19 PHP
解决laravel(5.5)访问public报错的问题
Oct 12 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 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
PHPExcel内存泄漏问题解决方法
2015/01/23 PHP
PHP中字符安全过滤函数使用小结
2015/02/25 PHP
帝国cms目录结构分享
2015/07/06 PHP
Laravel+jQuery实现AJAX分页效果
2016/09/14 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
thinkPHP5框架接口写法简单示例
2019/08/05 PHP
jquery 双色表格实现代码
2009/12/08 Javascript
Javascript学习笔记6 prototype的提出
2010/01/11 Javascript
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
jquery通过a标签删除table中的一行的代码
2013/12/02 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
2014/05/04 Javascript
javascript解三阶幻方(九宫格)
2015/04/22 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
Canvas 绘制粒子动画背景
2017/02/15 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
2017/07/13 Javascript
解决Vue2.0自带浏览器里无法打开的原因(兼容处理)
2017/07/28 Javascript
实现elementUI表单的全局验证的方法步骤
2019/04/29 Javascript
vue-video-player 断点续播的实现
2021/02/01 Vue.js
Python的词法分析与语法分析
2013/05/18 Python
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
python计算牛顿迭代多项式实例分析
2015/05/07 Python
Python实现对一个函数应用多个装饰器的方法示例
2018/02/09 Python
python程序如何进行保存
2020/07/03 Python
python实现AdaBoost算法的示例
2020/10/03 Python
美国嘻哈首饰购物网站:Hip Hop Bling
2016/12/30 全球购物
英语老师推荐信
2014/02/26 职场文书
高中生的自我评价
2014/03/04 职场文书
群众路线个人对照检查材料
2014/09/23 职场文书
大学生上课迟到检讨书
2014/10/15 职场文书
2014年幼儿园保育工作总结
2014/12/02 职场文书
学习弘扬焦裕禄精神心得体会
2016/01/23 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书
MySQL创建管理RANGE分区
2022/04/13 MySQL
i7 6700处理器相当于i5几代
2022/04/19 数码科技