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
弄了个检测传输的参数是否为数字的Function
Dec 06 PHP
php smarty模版引擎中变量操作符及使用方法
Dec 11 PHP
ajax+php打造进度条代码[readyState各状态说明]
Apr 12 PHP
PHP基础教程(php入门基础教程)一些code代码
Jan 06 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
Jun 21 PHP
PHP中VC6、VC9、TS、NTS版本的区别与用法详解
Oct 26 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
Dec 14 PHP
PHP实现微信提现(企业付款到零钱)
Aug 01 PHP
laravel框架中视图的基本使用方法分析
Nov 23 PHP
PHP 扩展Memcached命令用法实例总结
Jun 04 PHP
PHP与Web页面的交互示例详解二
Aug 04 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 UBB 解析实现代码
2011/11/27 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
2013/06/28 PHP
浏览器打开层自动缓慢展开收缩实例代码
2013/07/04 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
2016/01/08 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
2016/04/15 Javascript
jQuery 选择同时包含两个class的元素的实现方法
2016/06/01 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
总结js函数相关知识点
2018/02/27 Javascript
解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题
2019/10/25 Javascript
[53:49]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python生成随机密码的方法
2017/06/16 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
Sanic框架Cookies操作示例
2018/07/17 Python
pandas的唯一值、值计数以及成员资格的示例
2018/07/25 Python
Python实现Dijkstra算法
2018/10/17 Python
使用opencv将视频帧转成图片输出
2019/12/10 Python
Python如何使用argparse模块处理命令行参数
2019/12/11 Python
Django获取model中的字段名和字段的verbose_name方式
2020/05/19 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
Django url 路由匹配过程详解
2021/01/22 Python
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
JDBC操作数据库的基本流程是什么
2014/10/28 面试题
实习自我鉴定范文
2013/10/30 职场文书
优秀共产党员先进事迹
2014/01/27 职场文书
校企合作协议书
2014/04/16 职场文书
团结演讲稿范文
2014/05/23 职场文书
详解Html5项目适配系统深色模式方案总结
2021/04/14 HTML / CSS
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python
MySQL控制流函数(-if ,elseif,else,case...when)
2022/07/07 MySQL
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL