介绍
介绍
今天福哥带着大家给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还要考虑开启缓存功能的情况呀!
使用
代码
童鞋们看到这个示例代码可能会有点晕,这是什么呀?和之前学到的不一样嘛!福哥会找时间把这个模型表的功能专门找几节课讲给大家听,这块是TFModel的核心设计,是它的精髓所在~~
总结
福哥今天带着童鞋们给TFPHP框架的TFModel对象增加了upsert方法,这个方法比较神奇的是可以直接对一个数据记录进行更新操作,无论这条记录是否存在都可以更新成功!这个方法非常适合对对象附属数据表进行更新操作,大大简化了编写带的量。
借助TFModel的模型表参数,使得传入参数都变得简单了,使用起来是非常方便的!