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 相关文章推荐
一个用于网络的工具函数库
Oct 09 PHP
从一个不错的留言本弄的mysql数据库操作类
Sep 02 PHP
php 清除网页病毒的方法
Dec 05 PHP
php中导出数据到excel时数字变为科学计数的解决方法
Feb 03 PHP
PHP Global变量定义当前页面的全局变量实现探讨
Jun 05 PHP
深入php中var_dump方法的使用详解
Jun 24 PHP
php inc文件使用的风险和注意事项
Nov 12 PHP
js和php邮箱地址验证的实现方法
Jan 09 PHP
PHP封装分页函数实现文本分页和数字分页
Oct 23 PHP
PHP+shell实现多线程的方法
Jul 01 PHP
PHP中抽象类、接口的区别与选择分析
Mar 29 PHP
ThinkPHP实现生成和校验验证码功能
Apr 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
PHP脚本的10个技巧(2)
2006/10/09 PHP
一段防盗连的PHP代码
2006/12/06 PHP
php下使用SMTP发邮件的代码
2008/01/10 PHP
php轻量级的性能分析工具xhprof的安装使用
2015/08/12 PHP
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
jQuery代码优化之基本事件
2011/11/01 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
使用Jquery获取带特殊符号的ID 标签的方法
2014/04/30 Javascript
JavaScript构造函数详解
2015/12/27 Javascript
EasyUI创建对话框的两种方式
2016/08/23 Javascript
javascript 动态样式添加的简单实现
2016/10/11 Javascript
AngularJS 中使用Swiper制作滚动图不能滑动的解决方法
2016/11/15 Javascript
Angular实现的table表格排序功能完整示例
2017/12/22 Javascript
Vue 刷新当前路由的实现代码
2019/09/26 Javascript
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
Python中的os.path路径模块中的操作方法总结
2016/07/07 Python
简单的python协同过滤程序实例代码
2018/01/31 Python
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
详解Python装饰器
2019/03/25 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
使用python实现希尔、计数、基数基础排序的代码
2019/12/25 Python
Python守护进程实现过程详解
2020/02/10 Python
Python xlrd excel文件操作代码实例
2020/03/10 Python
tensorflow图像裁剪进行数据增强操作
2020/06/30 Python
python Autopep8实现按PEP8风格自动排版Python代码
2021/03/02 Python
小天鹅官方商城:LittleSwan
2017/06/16 全球购物
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
启动一个线程是用run()还是start()
2016/12/25 面试题
四种会话跟踪技术
2015/05/20 面试题
应届生妇产科护士求职信
2013/10/27 职场文书
奥巴马上海演讲稿
2014/09/10 职场文书
法律意见书范文
2015/05/20 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书