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学习笔记(四)数据库的操作的更多相关文章

  1. thinkphp5.0学习笔记

    2019-11-11学习笔记 安装TP5.0 a)源代码包下载 在thinkphp官网下载(www.thinkphp.cn)下载 完整版本的TP5.0 b) composer 安装 切换到网站的根目录 ...

  2. Flask学习笔记:数据库ORM操作MySQL+pymysql/mysql-python+SQLAlchemy/Flask-SQLAlchemy

    Python中使用sqlalchemy插件可以实现ORM(Object Relationship Mapping,模型关系映射)框架,而Flask中的flask-sqlalchemy其实就是在sqla ...

  3. thinkphp5.0学习笔记(三)获取信息,变量,绑定参数

    1.构造函数: 控制器类必须继承了\think\Controller类,才能使用: 方法_initialize 代码: <?php namespace app\lian\controller; ...

  4. Flask学习笔记:数据库迁移操作flask-script+alembic/flask-migrate

    数据库迁移是将代码中模型类(即表)的修改同步到数据库中, flask-sqlalchemy的模型类一旦使用create_all()映射到数据库中后,对这个模型类的修改(例如添加了一个新的字段)就不会再 ...

  5. ThinkPHP 学习笔记 ( 四 ) 数据库操作之关联模型 ( RelationMondel ) 和高级模型 ( AdvModel )

    一.关联模型 ( RelationMondel ) 1.数据查询 ① HAS_ONE 查询 创建两张数据表评论表和文章表: tpk_comment , tpk_article .评论和文章的对应关系为 ...

  6. thinkphp5.0学习笔记(二)

    本文为公司制作API接口后台的小结! 1.命名注意事项: 不要使用易混淆的名字,如index,index01... 我喜欢用拼音... 比如: public function zhuce(Reques ...

  7. thinkphp5.0学习笔记(二)API后台处理与命名空间

    命名空间 先来看命名空间吧: 命名空间是学习TP的基础, <?php namespace app\lian\c1; class yi{ public $obj = "这是第一个空间里面 ...

  8. thinkphp5.0学习笔记(一)基础知识与URL访问

    1.目录结构: 其中thinkphp子目录是框架核心目录 thinkphp结构: 2.入口文件 默认自带的入口文件位于public/index.php 应用目录为application,其结构: in ...

  9. openresty 学习笔记四:连接mysql和进行相关操作

    openresty 学习笔记四:连接mysql和进行相关操作 毕竟redis是作为缓存,供程序的快速读写,虽然reidis也可以做持久化保存,但还是需要一个做数据存储的数据库.比如首次查询数据在red ...

随机推荐

  1. poj1990树状数组

    Every year, Farmer John's N (1 <= N <= 20,000) cows attend "MooFest",a social gather ...

  2. thinkphp 框架中的一部分方法解析

     1 thinkphp 框架 中判断输入的数值和数据库中的数值是否一致    首先 需要在view文件夹下建一个模板 名为zhuce.html <html> <head> &l ...

  3. Linux的正则表达式grep,egrep

    一.概念 正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一组特殊字符,组成一个"规则字符集合",根据用户指定的文本模式对目标文件进行逐行搜索匹配,显示能被模式匹配到的结果. ...

  4. TP5.0 PHPExcel 数据表格导出(原)

    今天看的是PHPExcel这个扩展库,Comporse 下载不下来,最后只能自己去github里面手动下载,但有一个问题就是下载下来的PHPExcel没有命名空间,所以框架里面的use根本引入不进去, ...

  5. redis单机主从搭建

    tar zxvf redis-2.8.13.tar.gz cd redis-2.8.13 make 1.安装主库 mkdir /opt/redis/sbin -p mkdir    /opt/redi ...

  6. ④JavaScript格式化时间戳

    这部分代码是按照网上的教程写的,忘记在哪里看到了

  7. java环境安装之不能安装exe文件

    经过多年,打算再学下java 从官网下载java8安装包,但因为我的计算机的cd-room被卸载掉了,安装是报错说cab文件损坏之类的错误. 从stackOverflow中找到一篇眼前一亮的解决办法. ...

  8. 【JAVAWEB学习笔记】13_servlet

    JavaWeb核心之Servlet 教学目标 案例一.完成用户登录功能 案例二.记录成功登录系统的人次 一.Servlet简介 1.什么是Servlet Servlet 运行在服务端的Java小程序, ...

  9. ztree实现权限功能(横向显示)

    最近在做权限功能的时候,采用的ztree实现的,但是产品要求最后一层的权限节点要横向显示.开始在网上找的解决方案是用css样式把最后一层的display设置为inline.在我本地电脑上看了下.效果不 ...

  10. JVM类加载续

    上一篇理解了JVM类加载过程的第一个阶段,这篇来说说剩下的阶段:验证.准备.解析.初始化.需要注意的是,这些阶段(解析除外)只是按照这个顺序开始,但是执行的过程中可能存在交叉. 验证:就是要对加载的二 ...