前言:

由于Thinkphp5和Thinkphp3.2.3的版本差距过大,

在记忆方面容易混淆。

故特意记录一下在数据操作上的对比的不同。


Tp3.2.3

  增:add(),addAll()

  查:find(),select(),getField()

  改:save(),setField(),setInc(),setDec()

     注意;setInc,setDec,在TP5中被设定为助手函数可操作方法,Db类和模型都不可以    

  删:delete(主键),或者where()->delete()


Tp5 DB类

  增:insert(),insertAll(),insertGetId()

  查:查的方法比较多

    1、返回一维关联数组的  Db::name(user)->find()

    2、返回二维关联数组的 Db::name(user)->select()

    3、返回某个字段字符串的 Db::name(user)->value("nickname")

    4、返回某个字段所有信息的 Db::name(user)->column("nickname")

    5、分批次查询的 chunk

      Db::name(user)->chunk(10,function($data){

        foreach($data as $key=>$vo){

        }

      })

  改:在Db类中,用的最多的还是update($data)方法,当然还有其他的快捷方法

    1、不带where条件的update($data)

      当$data数组包含主键时,会自动以主键作为条件

1                  $data = ['id'=>4,'nickname'=>"jimmy",'email'=>"jimmy@qq.com"];
2 echo Db::name("user")->update($data);
3           //返回值为影响行数

    2、或者通过链式操作带上条件

1                  $data = ['nickname'=>"jeffny",'email'=>"jimmy@qq.com"];
2 echo Db::name("user")->where("id=10")->update($data);

    3、如果仅仅只更新某个字段,或者字段更新为自增、自减、使用mysql函数等情况时,还可以使用setField,dec,inc,exp等形式

1              //修改单个字段
2 echo Db::name("user")->where("id=10")->setField("nickname",'lucy');
3 //字段递增
4 echo Db::name("user")->where("id=10")->inc('status')->update();
5 //字段递减
6 echo Db::name("user")->where("id=11")->dec('status')->update();
7 //使用mysql函数
8 echo Db::name("user")->where("id=4")->exp('nickname','UPPER(nickname)')->update();
9

  删:delete

1             // 根据主键
2 echo Db::name("user")->delete(3);
3 //根据条件
4 echo Db::name("user")->where("nickname='JIMMY'")->delete();

      


Tp5 Model模型

  增:save(),saveAll()

  查:模型里面关于查询的操作需要注意

    1、根据主键进行查询某条记录的get(2)

      注意:模型返回的是对象类型,但是由于模型实现了ArrayAccess接口,所以可以像操作数组一样操作对象

1              $data = UserModel::get(4);
2 echo $data['nickname'];
3 echo $data['birthday'];
4 echo $data['email'];
5 dump($data);

    2、如果不是根据主键进行查询,则使用getByColumn,比如根据邮箱插叙,方法名为getByEmail

1              $data = UserModel::getByEmail("374398393@qq.com");
2 echo $data['nickname'];
3 echo $data['birthday'];
4 echo $data['email'];
5 dump($data);

    3、对get方法传递数组条件也可以的

1              $data = UserModel::get(['nickname'=>"沐霖"]);
2
3 dump($data);

    4、但是注意 ,上面三种方法仅仅针对于获取一条记录,如果需要获取多条记录的话,需要使用方法all()

      该方法的返回值是数组,数组元素值则是对象(该对象等同于方法1的返回值),因此需要遍历数组才能取出数据

1              $data = UserModel::all();
2 foreach($data as $key=>$vo){
3 echo $vo['id'].'---'.$vo['nickname'].'---'.$vo['email'].'<br/>';
4 }
5

  改:模型里面的修改,操作起来也是比较另类

    1、对查询的数据修改并保存

1              $data =UserModel::get(3);
2 $data->nickname='沐霖Sicada2';
3 echo $data->save();

      喵喵喵??save()不是新增数据的方法么?!

      官网给出的解释如下:

    默认情况下,查询返回的模型实例如果执行save操作都是执行的数据库update(更新数据)操作,如果你需要实例化执行save执行数据库的insert(新增数据)操作,请确保在save方法之前调用isUpdate方法: 

   // 强制进行数据新增操作
   $user->isUpdate(false)->save();

    2、还有一种更高效的方法,直接使用update方法,前提是数组中必须包含主键

               $user['id']       = 1;
$user['nickname'] = '刘晨';
$user['email'] = 'liu21st@gmail.com';
echo UserModel::update($user);

       如果数组不包含主键,则报错

             

       操作正确的返回值则为json字符串

    {"id":1,"nickname":"刘晨","email":"liu21st@gmail.com"}

   

  删:delete()和destroy()

    1、先查后删或者指定where条件

1             //先查后删
2 echo userModel::get(1)->delete();
3 //或者指定where条件
4 echo userModel::where("id=10")->delete();       

    2、根据主键直接删除

1             //根据主键destroy
2 echo userModel::destroy(11);

比较常用的几个差异性:

  1、Tp5中不再支持_sql()函数的使用,必须选择  getLastSql()

    2、Tp5中Db类查询返回的是一维、二维数组,而模型中返回的则是,对象或者对象数组

  3、TP5号称对错误零容忍,对所有错误都是直接爆出,而不是像Tp3一样,调整数据或者不执行,所以在使用tp5的时候需要更严谨一些

  4、Tp5中的助手函数db()操作和Db类以及Model操作都略有差异,但是助手函数的执行效率相较这两者比较第一点,所以此处不考虑

ThinkPHP5的数据操作和Thinkphp3.2.3对比小结的更多相关文章

  1. thinkphp5--model数据操作的坑

    最近用thinkphp5开发,经常用到model了来操作数据,但是操作多了,就发现他的坑了. 就好像如果你只是初始化一个model对象,但是你却用这个对象进行多次的数据操作,这时候他的数据就会发生混乱 ...

  2. StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...

  3. hive数据操作

    mdl是数据操作类的语言,包括向数据表加载文件,写查询结果等操作 hive有四种导入数据的方式 >从本地加载数据 LOAD DATA LOCAL INPATH './examples/files ...

  4. Dapper 数据操作框架

    数据操作DapperFrom NuGet:Install-Package DapperorInstall-Package Dapper.StrongName微型ORM:PetaPoco获得PetaPo ...

  5. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

  6. coreData数据操作

    // 1. 建立模型文件// 2. 建立CoreDataStack// 3. 设置AppDelegate 接着 // // CoreDataStack.swift // CoreDataStackDe ...

  7. Entity Framework 5.0系列之数据操作

    Entity Framework将概念模型中定义的实体和关系映射到数据源,利用实体框架可以将数据源返回的数据具体化为对象:跟踪对象所做的更改:并发处理:将对象更改传播到数据源等.今天我们就一起讨论如何 ...

  8. 数据操作语言DML与运算符

    数据操作语言DML(添加,修改,删除) 1.添加数据 insert into insert into 表名 (字段列表) values (值列表),值列表要和字段列表按顺序匹配. insert int ...

  9. SQL不同服务器数据库之间的数据操作整理(完整版)

    ---------------------------------------------------------------------------------- -- Author : htl25 ...

随机推荐

  1. 大牛推荐的5本 Linux 经典必读书

    今天给大家推荐5本Linux学习相关的书籍:这些书籍基本都是很多大牛推荐过,并且深受业界好评的书:虽然只有5本,但是相信把5本全都认真看过的同学应该不多吧?希望这些书能够帮助你进阶为大牛! 上期传送门 ...

  2. Cocos Creator 使用计时器(官方文档摘录)

    在 Cocos Creator 中,我们为组件提供了方便的计时器,这个计时器源自于 Cocos2d-x 中的 cc.Scheduler,我们将它保留在了 Cocos Creator 中并适配了基于组件 ...

  3. 记mysql中时间相关的一个奇怪问题

    发现mysql中类型为时间的字段,在查询时显示的时间是什么是依赖于客户端的,不同的客户端查同一个时间,可能在客户端显示的时间是不一样的.至于这个在哪里配置,以及服务端如何依据这个配置为客户端返回结果, ...

  4. python全栈第一章

    第一章 Python基础变量定义规则:1.变量名只能是字母数字或者下划线的任意组合2.变量名的第一个字符不能是数字3.关键字不能申明为变量名定义方式:1.驼峰体AgeOfSzp2.下划线隔开Age_o ...

  5. Hdu2041 超级楼梯 (斐波那契数列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2041 超级楼梯 Time Limit: 2000/1000 MS (Java/Others)    M ...

  6. LR访问Https接口

    实操篇 第一步:需要跟开发或者运维要到要访问的https接口的证书(有关证书的问题我们在原理中有解释). 第二步:确定要来的证书的格式是否为pem格式的.首先,LR只能够识别pem格式的证书而且是DE ...

  7. Docker Overlay 应用部署

    Docker Overlay 部署条件 要想使用Docker原生Overlay网络,需要满足以下任意条件: 1.Docker运行在Swarm模式 2.使用键值存储的Docker主机集群 本次部署使用键 ...

  8. RESTful API 设计指南-阮一峰

    作者: 阮一峰 日期: 2014年5月22日 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制 ...

  9. day03变量的命名规范,常量,输出:自带换行,输入,注释,数据类型,运算符,常用字符大小关系

    复习 ''' 1.语言的分类 -- 机器语言:直接编写0,1指令,直接能被硬件执行 -- 汇编语言:编写助记符(与指令的对应关系),找到对应的指令直接交给硬件执行 -- 高级语言:编写人能识别的字符, ...

  10. mybatis分页插件PagePlugin

    查询的参数对象里面继承PageInfoWrapper类(也可以不继承这个类,但要保证查询参数对象里面必须要有一个PageInfo属性) 分页信息都在PageInfo这个类里,查询的时候,分页参数,填充 ...