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通过header实现文本文件下载的代码
Aug 08 PHP
php下使用curl模拟用户登陆的代码
Sep 10 PHP
PHP学习之字符串比较和查找
Apr 17 PHP
基于header的一些常用指令详解
Jun 06 PHP
ThinkPHP缓存方法S()概述
Jun 13 PHP
PHP文件缓存类示例分享
Jan 30 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
Oct 08 PHP
php array_keys 返回数组的键名
Oct 25 PHP
PHP使用new StdClass()创建空对象的方法分析
Jun 06 PHP
php删除一个路径下的所有文件夹和文件的方法
Feb 07 PHP
PDO::setAttribute讲解
Jan 29 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中在数据库中保存Checkbox数据(2)
2006/10/09 PHP
用libTemplate实现静态网页的生成
2006/10/09 PHP
几种显示数据的方法的比较
2006/10/09 PHP
Linux下进行MYSQL编程时插入中文乱码的解决方案
2007/03/15 PHP
PHP 字符串 小常识
2009/06/05 PHP
7个超级实用的PHP代码片段
2011/07/11 PHP
php解决约瑟夫环示例
2014/04/09 PHP
3种php生成唯一id的方法
2015/11/23 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
2016/03/10 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
2019/10/10 PHP
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
深入理解vue-router之keep-alive
2017/08/31 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
NodeJs实现简易WEB上传下载服务器
2019/08/10 NodeJs
vue如何使用rem适配
2021/02/06 Vue.js
python爬虫教程之爬取百度贴吧并下载的示例
2014/03/07 Python
python简单实现基数排序算法
2015/05/16 Python
Python中的推导式使用详解
2015/06/03 Python
Flask框架配置与调试操作示例
2018/07/23 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
python自动点赞功能的实现思路
2020/02/26 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
极简的HTML5模版
2015/07/09 HTML / CSS
应用心理学个人求职信范文
2013/12/11 职场文书
关于毕业的广播稿
2014/01/10 职场文书
应届大学生简历中的自我评价
2014/01/15 职场文书
公务员诚信承诺书
2014/05/26 职场文书
司法局火灾防控方案
2014/06/05 职场文书
代理人委托书
2014/09/16 职场文书
导游词之铁岭象牙山
2019/12/06 职场文书
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python
微软官方消息,在 2023 年 4 月 11 日之后微软将不再为 Office 2013 和 Skype for Business 2015 提供安全更新
2022/04/21 数码科技
Python实战实现爬取天气数据并完成可视化分析详解
2022/06/16 Python