thinkphp5.0学习笔记(四)数据库的操作
ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理。采用PDO方式,目前包含了Mysql、SqlServer、PgSQL、Sqlite等数据库的支持。
1.基本使用
配置了数据库连接信息后,我们就可以直接使用数据库运行原生SQL操作了,支持query
(查询操作)和execute
(写入操作)方法,并且支持参数绑定。
public function read()
{
$sql = Db::query('select * from news');
dump($sql); }
输出的是:
execute方法:
public function read()
{
$sql = Db::execute('insert into news (nid, rid) values (11, 11)');;
dump($sql);
}
输出:
数据库添加成功!
也支持命名占位符绑定,例如:
public function read()
{
$sql = Db::query('select * from news where nid=:nid',['nid'=>1]);
dump($sql);
}
输出:
execute方法:
public function read()
{
$sql = Db::execute('insert into news (nid, rid) values (:nid, :rid)',['nid'=>18,'rid'=>'121']);
dump($sql);
}
输出:
数据库添加成功!
可以使用多个数据库连接:
2.查询构造器
听名字就知道,很装X..
先来看基本查询;
查询一个数据:
// table方法必须指定完整的数据表名
$sql =Db::table('news')->where('nid',1)->find();
dump($sql);
find = 查询一条;并且查询结果不存在,返回 null
输出:
Db::table('think_user')->where('status',1)->select();
这条查询语句与上面同效,但是select 方法查询结果不存在,返回空数组
额 这个玩意叫查询数据集,没错!
默认情况下,find和select方法返回的都是数组。
如果你要查询某个字段的值,咋整?
public function read()
{
// 返回某个字段的值
$sql =Db::table('news')->where('nid',18)->value('rid');
dump($sql);
}
这样看输出,我求rid的值:
如果你需要处理成千上百条数据库记录,可以考虑使用chunk方法,该方法一次获取结果集的一小块,然后填充每一小块数据到要处理的闭包,该方法在编写处理大量数据库记录的时候非常有用。
public function read()
{
$sql =Db::table('news')->chunk(1,function($user){
foreach($user as $u)
{
dump($u);
}
}); }
这个样子 就可以一条一条都给遍历出来了!
是“一条一条·”,嘿!
3.添加数据跟删除数据
使用 Db
类的 insert
方法向数据库提交数据
public function read()
{
$data = ['ntitle' => '123', 'rid' => '456'];
$sql = Db::table('news')->insert($data); dump($sql);
}
添加成功后insert 方法返回添加成功的条数,insert 正常情况返回 1
添加数据后如果需要返回新增数据的自增主键,可以使用getLastInsID
方法:
public function read()
{
$data = ['ntitle' => '123', 'rid' => '345'];
$sql = Db::table('news')->insert($data);
$userId = Db::name('news')->getLastInsID('nid');
dump($userId);
dump($sql);
}
看输出:
主键字段22!
添加多条数据:
添加多条数据直接向 Db 类的 insertAll 方法传入需要添加的数据即可;
public function read()
{
$data = [
['ntitle' =>'gaga','rid' => '12'],
['ntitle' =>'gaaaga','rid' => '123']
];
$sql = Db::table('news')->insertAll($data); dump($sql);
}
这样的话,返回的应该是两条2
删除数据:
根据主键来删除
public function read()
{
// 根据主键 来删
$sql = Db::table('news')->delete(1);
//多删
//$sql = Db::table('news')->delete(1,2,3);
dump($sql);
}
执行成功返回影响行数;
还有一种是根据条件来删除的
public function read()
{
// 根据条件 来删
$sql = Db::table('news')->where('nid',18)->delete();
//多删
//$sql = Db::table('news')->where('nid','<',1)->delete();
dump($sql);
}
执行成功也是返回影响行数;
4.查询方法:
where方法:
可以使用where
方法进行AND
条件查询:
public function read()
{
$sql = Db::table('news')
->where('nid',20)
->where('ntitle',123)
->find();
dump($sql);
}
whereOr方法:
使用whereOr
方法进行OR
查询:
public function read()
{
$sql = Db::table('news')
->where('nid',20)
->whereOr('ntitle','like','%123%')
->find();
dump($sql);
}
混合查询:
where方法和whereOr方法在复杂的查询条件中经常需要配合一起混合使用
public function read()
{
$sql = Db::table('news')
->where(function($query){
$query->where('nid',21)->where('nid',22);
})
->whereOr(function($query)
{
$query->where('ntitle','123')->whereOr('ntitle','123');
})
->select();
dump($sql);
}
输出的是:
看一下生成的代码:
SELECT * FROM `news` WHERE ( `nid` = 1 OR `nid` = 2 ) OR ( `ntitle` LIKE '123' OR `ntitle` LIKE '123' )
第一个查询方法用where或者whereOr是没有区别的。
thinkphp5.0学习笔记(四)数据库的操作的更多相关文章
- thinkphp5.0学习笔记
2019-11-11学习笔记 安装TP5.0 a)源代码包下载 在thinkphp官网下载(www.thinkphp.cn)下载 完整版本的TP5.0 b) composer 安装 切换到网站的根目录 ...
- Flask学习笔记:数据库ORM操作MySQL+pymysql/mysql-python+SQLAlchemy/Flask-SQLAlchemy
Python中使用sqlalchemy插件可以实现ORM(Object Relationship Mapping,模型关系映射)框架,而Flask中的flask-sqlalchemy其实就是在sqla ...
- thinkphp5.0学习笔记(三)获取信息,变量,绑定参数
1.构造函数: 控制器类必须继承了\think\Controller类,才能使用: 方法_initialize 代码: <?php namespace app\lian\controller; ...
- Flask学习笔记:数据库迁移操作flask-script+alembic/flask-migrate
数据库迁移是将代码中模型类(即表)的修改同步到数据库中, flask-sqlalchemy的模型类一旦使用create_all()映射到数据库中后,对这个模型类的修改(例如添加了一个新的字段)就不会再 ...
- ThinkPHP 学习笔记 ( 四 ) 数据库操作之关联模型 ( RelationMondel ) 和高级模型 ( AdvModel )
一.关联模型 ( RelationMondel ) 1.数据查询 ① HAS_ONE 查询 创建两张数据表评论表和文章表: tpk_comment , tpk_article .评论和文章的对应关系为 ...
- thinkphp5.0学习笔记(二)
本文为公司制作API接口后台的小结! 1.命名注意事项: 不要使用易混淆的名字,如index,index01... 我喜欢用拼音... 比如: public function zhuce(Reques ...
- thinkphp5.0学习笔记(二)API后台处理与命名空间
命名空间 先来看命名空间吧: 命名空间是学习TP的基础, <?php namespace app\lian\c1; class yi{ public $obj = "这是第一个空间里面 ...
- thinkphp5.0学习笔记(一)基础知识与URL访问
1.目录结构: 其中thinkphp子目录是框架核心目录 thinkphp结构: 2.入口文件 默认自带的入口文件位于public/index.php 应用目录为application,其结构: in ...
- openresty 学习笔记四:连接mysql和进行相关操作
openresty 学习笔记四:连接mysql和进行相关操作 毕竟redis是作为缓存,供程序的快速读写,虽然reidis也可以做持久化保存,但还是需要一个做数据存储的数据库.比如首次查询数据在red ...
随机推荐
- luogu P1015 回文数
题目描述: 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制 ...
- Java核心技术 卷I chapter05 继承
2017年4月10日19:41:44 仅仅用于打好基础 1. 在Java中,所有的继承都是公有继承,而没有C++中的私有继承和保护继承! 2.关键字super的使用方法: (1) 子类中想调用父类中的 ...
- MyEclipse9.0破解
http://www.cnblogs.com/liulanglang/archive/2011/11/15/2249702.html
- 通过HPS控制FPGA端的GPIO
该笔记主要记录HPS端如何通过AXI Bridge控制FPGA端口的GPIO,主要是如何操作FPGA侧的Led 1.AXI Bridge AXIB主要包括H2FB.F2HB.LWH2F ...
- C# 关于操作datatable的列名和删除某一列的数据
1.获取一个数据集表 DataTable dt = selectDEGS(type, words, KUser); 2.删除某一列 dt.Columns.Remove("TaskID&quo ...
- spring-线程池(1)
多线程并发处理起来通常比较麻烦,如果你使用spring容器来管理业务bean,事情就好办了多了.spring封装了java的多线程的实现,你只需要关注于并发事物的流程以及一些并发负载量等特性,具体来说 ...
- c语言项目开发流程二部曲
一.在第一部曲中我们介绍了电子词典项目开发的前5步,下面继续我们的步伐. 6.函数接口设计,这一步不是一蹴而就的,在项目进行中得不断修改,下面是我电子词典项目接口. /**************函数 ...
- OpenStack云平台的网络模式及其工作机制
网络,是OpenStack的部署中最容易出问题的,也是其结构中难以理清的部分.经常收到关于OneStack部署网络方面问题和OpenStack网络结构问题的邮件.下面根据自己的理解,谈一谈OpenSt ...
- css实现梯形(各种形状)的网页布局——transform的妙用
在各式各样的网页中,经常会看到形状特别的布局,比如说下面的这种排版方式: 这种视觉上的效果,体验十分好.那么他是如何来实现的呢,博主在这里整理了如下2种实现的方式. 1.通过给 div 加border ...
- 读 Zepto 源码之集合元素查找
这篇依然是跟 dom 相关的方法,侧重点是跟集合元素查找相关的方法. 读Zepto源码系列文章已经放到了github上,欢迎star: reading-zepto 源码版本 本文阅读的源码为 zept ...