ThinkPHP 鲜为人知的 selectAdd 方法 addAll( select() )

2023-05-16

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);


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ThinkPHP 鲜为人知的 selectAdd 方法 addAll( select() ) 的相关文章

随机推荐