ThinkPHP5的数据操作和Thinkphp3.2.3对比小结
前言:
由于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对比小结的更多相关文章
- thinkphp5--model数据操作的坑
最近用thinkphp5开发,经常用到model了来操作数据,但是操作多了,就发现他的坑了. 就好像如果你只是初始化一个model对象,但是你却用这个对象进行多次的数据操作,这时候他的数据就会发生混乱 ...
- StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)
本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...
- hive数据操作
mdl是数据操作类的语言,包括向数据表加载文件,写查询结果等操作 hive有四种导入数据的方式 >从本地加载数据 LOAD DATA LOCAL INPATH './examples/files ...
- Dapper 数据操作框架
数据操作DapperFrom NuGet:Install-Package DapperorInstall-Package Dapper.StrongName微型ORM:PetaPoco获得PetaPo ...
- Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页
models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...
- coreData数据操作
// 1. 建立模型文件// 2. 建立CoreDataStack// 3. 设置AppDelegate 接着 // // CoreDataStack.swift // CoreDataStackDe ...
- Entity Framework 5.0系列之数据操作
Entity Framework将概念模型中定义的实体和关系映射到数据源,利用实体框架可以将数据源返回的数据具体化为对象:跟踪对象所做的更改:并发处理:将对象更改传播到数据源等.今天我们就一起讨论如何 ...
- 数据操作语言DML与运算符
数据操作语言DML(添加,修改,删除) 1.添加数据 insert into insert into 表名 (字段列表) values (值列表),值列表要和字段列表按顺序匹配. insert int ...
- SQL不同服务器数据库之间的数据操作整理(完整版)
---------------------------------------------------------------------------------- -- Author : htl25 ...
随机推荐
- python使用grpc调用rpc接口
proto文件: syntax = "proto3"; package coupon; // //message UnsetUseC2URequest { // int64 bid ...
- Go 初体验 - 令人惊叹的语法 - defer.2 - 如何提前执行?
上一文中讲到 defer 会在宿主函数 return 之前调用,那么我们就是想在宿主函数执行到中间调用,怎么办呢? 1. 改变宿主函数逻辑,分成多个函数,需要的那个函数里 defer . 2. 使用匿 ...
- java 知识点
1. java泛型 避免编译错误 (ArrayList定义时候) 避免强制类型装换 2 多态的体现 实现多态主要有以下三种方式:1. 接口实现 2. 继承父类重写方法 3. 同一类中进行方法重载 ...
- poj3133 插头dp
#include <iostream> #include <cstdio> #include <string.h> #include <vector> ...
- RxJava 详解——简洁的异步操作(二)
上次说的两个例子,事件的发出和消费都是在同一个线程的.如果只用上面的方法,实现出来的只是一个同步的观察者模式.观察者模式本身的目的就是异步机制,因此异步对于 RxJava 是至关重要的.而要实现异步, ...
- python 减少可调用对象的参数个数
有一个被其他python 代码使用的callable 对象,可能是一个回调函数或者是一个处理器,但是它的参数太多了,导致调用时出错 如果需要减少某个函数的参数个数, 你可以使用functools.pa ...
- MongoExport后的负载均衡问题查询及解决:can't accept new chunks because there are still 2 deletes from previous migration
问题 前一阵有一个数据导出需求,按照各种数据库的使用方法,使用MongoExport方法导出数据,将数据导出到本地文件系统,在导出之后遇到此问题. 此问题和mongoexport的原理有关,我们知道数 ...
- javax.el.PropertyNotFoundException: Property 'know_id' not found on type java.lang.String
今天通过Servlet明明查出来了结果,在跳转到页面时报这个异常.根据经验仔细核对了字段书写时,未发现错误. 耐心仔细检查之后发现el表达式的List集合写错了 <c:forEach items ...
- 服务器日志文件Web远程查看
公司买的一款企业应用软件,所有透过应用操作DB的操作都会生成有日志,日志是以文本文件的形式存放在服务器上,后缀名为*.log.1,*.log.2之类的,软件本身也提供功能查询这些日志,但这个查询的功能 ...
- double保留两位小数
public static String format(double dValue, int lScale) { // ////负数,则装化为正数后进行四舍五入 boolean bFlag = fal ...