同福

做个web框架(26)——TFModel实现upsert方法功能【20210117】

介绍

介绍

今天福哥带着大家给TFPHP框架的TFModel对象添加一个很棒的方法——upsert。看过前一课的童鞋应该已经了解了,这里福哥再介绍一下。所谓的upsert其实是两个单纯融合到一起的一个伪单词,这两个单词分别为update和insert,这是两个完全不同的操作,那么upsert方法如何将这两个操作结合到一起的呢?

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

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

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

TFModel

路径

TFPHP\Model\TFModel

方法

upsert

public function upsert(string $table,array $data,?array $dataType,array $values):bool{
    $a=$this->tables[$table];
    if($a==null){
        return false;
    }
    $b=$a['options']['tfdoKey'];
    $c=$this->tfphp->getDatabase()->getTFDO($b);
    if($c==null){
        return false;
    }
    try{
        $d=$this->update($table,$data,$dataType,$values);
    }
    catch(\Exception $e){
        throw $e;
    }
    if(!$d){
        return false;
    }
    $f=$c->getLastEffectedRows();
    if($f>0){
        return true;
    }
    if(is_array($a['fields'])){
        $g=0;
        foreach($a['fields'] as  $h=>$i){
            $data[$h]=$values[$g];
            $dataType[$h]=$i;
            $g++;
        }
    }
    try{
        $d=$this->insert($table,$data,$dataType);
    }
    catch(\Exception $e){
        throw $e;
    }
    if(!$d){
        return false;
    }
    return true;
}

讲解

TFModel

upsert

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

首先必须保证更新记录的条件是主键字段或者约束字段,而模型的update和delete方法都是根据模型表配置参数映射的,所以这里只需要传入$values数组就可以了

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

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

为什么不直接使用TFDO的upsert呢?因为TFModel还要考虑开启缓存功能的情况呀!

使用

代码

d1db7378cbd057c7.jpg童鞋们看到这个示例代码可能会有点晕,这是什么呀?和之前学到的不一样嘛!福哥会找时间把这个模型表的功能专门找几节课讲给大家听,这块是TFModel的核心设计,是它的精髓所在~~

总结

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

借助TFModel的模型表参数,使得传入参数都变得简单了,使用起来是非常方便的!