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中使用Oracle数据库(6)
Oct 09 PHP
使用数据库保存session的方法
Oct 09 PHP
PHPThumb图片处理实例
May 03 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
Jun 26 PHP
推荐一款MAC OS X 下php集成开发环境mamp
Nov 08 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
Nov 19 PHP
Laravel 5 框架入门(四)完结篇
Apr 09 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
Dec 17 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
Mar 18 PHP
自制PHP框架之路由与控制器
May 07 PHP
在Laravel 中实现是否关注的示例
Oct 22 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
phpmyadmin的#1251问题
2006/11/25 PHP
PHP spl_autoload_register实现自动加载研究
2011/12/06 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
2015/03/26 PHP
php表单加入Token防止重复提交的方法分析
2016/10/10 PHP
Laravel 解决composer相关操作提示php相关异常的问题
2019/10/23 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
php模拟实现斗地主发牌
2020/04/22 PHP
Javascript中的数学函数
2007/04/04 Javascript
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
2014/04/12 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
js事件绑定快捷键以ctrl+k为例
2014/09/30 Javascript
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
2016/06/13 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
AngularJS实现图片上传和预览功能的方法分析
2017/11/08 Javascript
webpack4 + react 搭建多页面应用示例
2018/08/03 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
2019/11/01 Javascript
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
[11:27]《一刀刀一天》之DOTA全时刻20:TI4总奖金突破920W TS赛事分析
2014/06/18 DOTA
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
使用Python从有道词典网页获取单词翻译
2016/07/03 Python
Python自定义线程类简单示例
2018/03/23 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
2019/04/29 Python
Python 根据日志级别打印不同颜色的日志的方法示例
2019/08/08 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
初任培训自我鉴定
2013/10/07 职场文书
酒店总经理欢迎词
2014/01/08 职场文书
十八大感想感言
2014/02/10 职场文书
小学生中国梦演讲稿
2014/04/23 职场文书
美丽家庭事迹材料
2014/05/03 职场文书
教师批评与自我批评
2014/10/15 职场文书
九寨沟导游词
2015/02/02 职场文书
python使用matplotlib绘制图片时x轴的刻度处理
2021/08/30 Python
php双向队列实例讲解
2021/11/17 PHP