同福

做个web框架(25)——TFDO实现upsert方法功能【20210116】

介绍

介绍

今天福哥带着大家给TFPHP框架的TFDO对象添加一个很棒的方法——upsert。所谓的upsert其实是两个单纯融合到一起的一个伪单词,这两个单词分别为update和insert,这是两个完全不同的操作,那么upsert方法如何将这两个操作结合到一起的呢?

首先我们了解一下upsert的最终目的,它的最终目的就是要保证数据表当中有一条包含指定数据的记录。这里面有个问题,如果要执行update操作的话当原记录不存在就会失败,如果要执行insert操作的话只能执行一次。最好的办法就是先尝试去update一下,如果发现失败了再执行insert操作,这样可以保证数据一定可以写入到数据表当中。

然后要实现upsert方法必须满足一个前提条件 ,就是目标更新的记录必须是通过主键字段或者约束字段实现的,换言之更新的记录只能是一条满足条件,这个很重要!

最后了解了upsert的工作原理,现在我们就要给TFDO对象增加upsert这种便捷的功能方法了!

TFDO

路径

TFPHP\Database\SQL\TFDO

方法

upsert

public function upsert(string $table,array $data,?array $dataType,array $keyData,?array $keyDataType):bool{
    $a="";
    $b=array();
    foreach($data as  $c=>$d){
        $e="str";
        if($dataType[$c]!=""){
            $e=$dataType[$c];
        }
        $a.=" AND ".$c." = @".$e;
        $b[]=$d;
    }
    if($a!=""){
        $a=substr($a,5);
    }
    $f=$this->update($table,$data,$dataType,$a,$b);
    if(!$f){
        return false;
    }
    $g=$this->getLastEffectedRows();
    if($g>0){
        return true;
    }
    foreach($keyData as  $c=>$h){
        $data[$c]=$h;
        if($keyDataType[$c]!=""){
            $dataType[$c]=$keyDataType[$c];
        }
    }
    $f=$this->insert($table,$data,$dataType);
    if(!$f){
        return false;
    }
    return true;
}

讲解

TFDO

upsert

这个upsert函数的原理福哥要详情讲讲 ,大家仔细听好了!

首先必须保证更新记录的条件是主键字段或者约束字段,所以增加了$keyData条件参数

其次进入函数先尝试去update数据 ,并通过lastEffectedRows判断更新操作是否有数据被更改了

最后如果有数据被更改了就直接返回成功就好了,如果没有就通过insert语句插入这条记录

使用

代码

b32bce4c8bdbcf31.jpg

总结

福哥今天带着童鞋们给TFPHP框架的TFDO对象增加了upsert方法,这个方法比较神奇的是可以直接对一个数据记录进行更新操作,无论这条记录是否存在都可以更新成功!这个方法非常适合对对象附属数据表进行更新操作,大大简化了编写带的量。

下一课 ,福哥会带着童鞋们给TFPHP框架的TFModel对象也增加upsert方法,因为在实际开发当中操作数据库都是通过模型完成的~~