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);声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
