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
php获取本地图片文件并生成xml文件输出具体思路
Apr 27 PHP
ThinkPHP字符串函数及常用函数汇总
Jul 18 PHP
如何让CI框架支持service层
Oct 29 PHP
经典PHP加密解密函数Authcode()修复版代码
Apr 05 PHP
PHP中抽象类、接口的区别与选择分析
Mar 29 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
Jun 05 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
Sep 30 PHP
iOS+PHP注册登录系统 PHP部分(上)
Dec 26 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 PHP
Centos7安装swoole扩展操作示例
Mar 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
PHP4实际应用经验篇(7)
2006/10/09 PHP
Php header()函数语法及使用代码
2013/11/04 PHP
PHP中读取照片exif信息的方法
2014/08/20 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
2019/01/15 PHP
Javascript+XMLHttpRequest+asp.net无刷新读取数据库数据
2009/08/09 Javascript
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
window.location.hash 使用说明
2010/11/08 Javascript
js 处理URL实用技巧
2010/11/23 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
jQuery+ajax读取并解析XML文件的方法
2016/09/09 Javascript
深入理解AngularJS中的ng-bind-html指令
2017/03/27 Javascript
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
微信小程序嵌入腾讯视频源过程详解
2019/08/08 Javascript
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
JS实现网站楼层导航效果代码实例
2020/06/16 Javascript
Element Backtop回到顶部的具体使用
2020/07/27 Javascript
[26:52]LGD vs EG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
基于Python log 的正确打开方式
2018/04/28 Python
Python中的 is 和 == 以及字符串驻留机制详解
2019/06/28 Python
对pytorch中的梯度更新方法详解
2019/08/20 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
2020/02/03 Python
Python 实现国产SM3加密算法的示例代码
2020/09/21 Python
全球最大的服务市场:Fiverr
2017/01/03 全球购物
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
德语专业求职信
2014/03/12 职场文书
教师教学评估方案
2014/05/09 职场文书
物理课外活动总结
2014/08/27 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
2014副镇长民主生活会个人对照检查材料思想汇报
2014/09/30 职场文书
四大名著读书笔记
2015/06/25 职场文书
Go Plugins插件的实现方式
2021/08/07 Golang
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python
基于Python实现流星雨效果的绘制
2022/03/18 Python