Yii框架批量插入数据扩展类的简单实现方法

5年以前  |  阅读数:334 次  |  编程语言:PHP 

本文实例讲述了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相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
将二进制数据转为16进制以便显示
获取IMSI
获取IMEI
Java生成UUID
PHP自定义函数获取搜索引擎来源关键字的方法
让你成为最历害的git提交人
在Zeus Web Server中安装PHP语言支持
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Yii2汉字转拼音类的实例代码
Python 2与Python 3版本和编码的对比
php+ajax+json 详解及实例代码
php封装的page分页类完整实例
PHP设计模式之工厂模式与单例模式
php数组合并array_merge()函数使用注意事项
PHP实现简单爬虫的方法
php实现数组中索引关联数据转换成json对象的方法
wget使用技巧