saveAll,批量更新

浏览:18949 发布日期:2015/09/25 分类:技术分享
看见挺多人问TP怎么写不同内容的批量更新。
我看遍了开发手册也没发现有这样的例子。

原先的项目放在云平台,用的是遍历更新,每天看着蹭蹭上涨的Mysql使用量,心疼。 赚钱不容易,能省一分是一分。

没有正统的学过PHP,半路出家,写的不好请多多指点!//数据
$data[] = array('id'=>1,'value'=>value1);
$data[] = array('id'=>2,'value'=>value2);
$data[] = array('id'=>3,'value'=>value3);

$this->saveAll($data,表名); 
    //批量更新
    public function saveAll($datas,$model){

        $model || $model=$this->name;

        $sql   = ''; //Sql
        $lists = []; //记录集$lists
        $pk    = $this->getPk();//获取主键

        foreach ($datas as $data) {
            foreach ($data as $key=>$value) {
                if($pk===$key){
                    $ids[]=$value;
                }else{
                    $lists[$key].= sprintf("WHEN %u THEN '%s' ",$data[$pk],$value);
                }
            }
        }

        foreach ($lists as $key => $value) {
            $sql.= sprintf("`%s` = CASE `%s` %s END,",$key,$pk,$value);
        }

        $sql = sprintf('UPDATE __%s__ SET %s WHERE %s IN ( %s )',strtoupper($model),rtrim($sql,','),$pk,implode(',',$ids));

        return M()->execute($sql);
    }
//生成的sql语句结构
UPDATE categories
    SET display_order = CASE id
        WHEN 1 THEN 3
        WHEN 2 THEN 4
        WHEN 3 THEN 5
    END
WHERE id IN (1,2,3)
最佳答案
评论( 相关
后面还有条评论,点击查看>>