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如何得到当前页和上一页的地址?
Nov 27 PHP
弄了个检测传输的参数是否为数字的Function
Dec 06 PHP
php的大小写敏感问题整理
Dec 29 PHP
win2003服务器使用WPS的COM组件的一些问题解决方法
Jan 11 PHP
php cookie中点号(句号)自动转为下划线问题
Oct 21 PHP
php实现猴子选大王问题算法实例
Apr 20 PHP
常见的四种POST 提交数据方式(小总结)
Oct 08 PHP
php 读取输出其他文件的实现方法
Jul 26 PHP
浅谈Yii乐观锁的使用及原理
Jul 25 PHP
PHP实现更改hosts文件的方法示例
Aug 08 PHP
PHP实现转盘抽奖算法分享
Apr 15 PHP
php中的钩子理解及应用实例分析
Aug 30 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 身份证号验证函数
2009/05/07 PHP
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
浅析php插件 HTMLPurifier HTML解析器
2013/07/01 PHP
浅析Laravel5中队列的配置及使用
2016/08/04 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
jquery.ui.progressbar 中文文档
2009/11/26 Javascript
jQuery插件 tabBox实现代码
2010/02/09 Javascript
JQuery扩展插件Validate 5添加自定义验证方法
2011/09/05 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
2014/01/26 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
swiper实现异形轮播效果
2019/11/28 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
2020/04/24 Javascript
[03:00]2014DOTA2国际邀请赛 Titan淘汰潸然泪下Ohaiyo专访
2014/07/15 DOTA
Python中的字典遍历备忘
2015/01/17 Python
Python遍历指定文件及文件夹的方法
2015/05/09 Python
详谈python read readline readlines的区别
2017/09/22 Python
python交互式图形编程实例(二)
2017/11/17 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
新手如何发布Python项目开源包过程详解
2019/07/11 Python
python并发编程多进程 模拟抢票实现过程
2019/08/20 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
使用phonegap播放音频的实现方法
2017/03/31 HTML / CSS
美国隐形眼镜零售商:LensPure
2019/03/10 全球购物
MAC Cosmetics巴西官方网站:M·A·C彩妆
2019/04/18 全球购物
2014政务公开实施方案
2014/02/19 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
法人代表证明书格式
2014/10/01 职场文书
幼儿园班级管理心得体会
2016/01/07 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
CentOS下安装Jenkins的完整步骤
2022/04/07 Servers
A22国内电台短波广播频率表
2022/05/10 无线电
springboot实现string转json json里面带数组
2022/06/16 Java/Android