ThinkPHP 鮮爲人知的 selectAdd 方法 addAll( select() )

TP算是國內相當熱門的一個PHP框架,相信大家對TP的普通增刪查改所用的select(),add(),save(),delect(),find(),getField()等等內置函數早已爛熟於心了。
今天,就向大家介紹一種TP手冊中未提及,但卻一直存在於源碼當中的 SelectAdd()方法(3.1,3.2均支持)。這是本人在閱讀TP源碼的時候的偶然發現,前幾天剛好碰到一個用得着的業務邏輯,便嘗試使用了一下這個方法。

selectAdd()方法源碼在TP 的Model.class.php下:

/**
     * 通過Select方式添加記錄
     * @access public
     * @param string $fields 要插入的數據表字段名
     * @param string $table 要插入的數據表名
     * @param array $options 表達式
     * @return boolean
     */
    public function selectAdd($fields='',$table='',$options=array()) {
        // 分析表達式
        $options =  $this->_parseOptions($options);
        // 寫入數據到數據庫
        if(false === $result = $this->db->selectInsert($fields?$fields:$options['field'],$table?$table:$this->getTableName(),$options)){
            // 數據庫插入操作失敗
            $this->error = L('_OPERATION_WRONG_');
            return false;
        }else {
            // 插入成功
            return $result;
        }
    }

其功能相當於TP內 addAll(select()) 方法的組合。

select()方法大家已經很熟悉了,這裏說明一下addAll()方法。
addAll()即批量插入。

$data=>Array(
    [0]=>Array(
        'id'=>1,
        'name'=>'張三'
    ),
    [1]=>Array(
        'id'=>2,
        'name'=>'李四'
    ),
    [2]=>Array(
        'id'=>3,
        'name'=>'王五'
    )
    ...
);
M()->table('users')->data($data)->addAll(); //批量插入(支持二維數組)
生成的sql語句是:

INSERT INTO `users` (`id`, `name`) VALUES ('1', '張三'),('2', '李四'),('3', '王五')...;

那麼addAll( select() ) 顯然便是將select查詢出的數據批量插入到數據表中,而selectAdd()便直接能達到這個功能。
例如:數據庫中數據如下表(class),現要將下表數據複製到新表(part)中並改變其parentid,則可使用selectAdd()方法

id name parentid
1 足球 2
2 籃球 2
3 排球 2
M('class')->where('parentid=2')->field('id,name,5')->selectAdd('id,name,parentid','part');

對應生成的sql爲:
INSERT INTO `part` (`id`, `name`,`parentid`) (Select `id`,`name`,`5` from `class` where parentid=2);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章