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. apache配置多个虚拟目录站点

    错误的做法 网上查了几个资料,做法如下:比如想配置两个www.web1.com  www.web2.com站点 打开httpd.conf ,然后添加: <VirtualHost *:80> ...

  2. angular2项目添加ng2-bootstrap

    1. 先webstome创建一个空的工程.例如test File--> New -->Project --> Empty Project 2.然后命令行(Alt+F12)下执行以下命 ...

  3. Tp5.0 PHPMailer邮件发送

    今天突然想起来邮件发送,就看了一下PHPmailer,其实这个用起来很简单,都是封装好的 https://github.com/PHPMailer/PHPMailer,直接下载下来之后,把他放入TP5 ...

  4. MySQL ProxySQL读写分离使用初探

    目的 在美团点评DBProxy读写分离使用说明文章中已经说明了使用目的,本文介绍ProxySQL的使用方法以及和DBProxy的性能差异.具体的介绍可以看官网的相关说明,并且这个中间件也是percon ...

  5. Redis学习-SortedSet

    Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中.它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联, ...

  6. 实现ThreadFactory接口生成自定义的线程给Fork/Join框架

    Fork/Join框架是Java7中最有趣的特征之一.它是Executor和ExecutorService接口的一个实现,允许你执行Callable和Runnable任务而不用管理这些执行线程.这个执 ...

  7. 1.javascript节点的操作 创建、添加、移除、移动、复制、插入(修改)

    (1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 createTextNode() //创建一个文本节 ...

  8. NancyFx 2.0的开源框架的使用-Caching

    新建一个空的Web项目,命名CachingDemo 然后添加三个Nuget安装包 Nancy Nancy.Hosting.Aspnet Nancy.ViewsEngines.Razor 然后往项目里面 ...

  9. 空间索引 - GeoHash算法及其实现优化

    h1,h2,h3,h4,h5,h6,p,blockquote { margin: 0; padding: 0 } body { font-family: "Helvetica Neue&qu ...

  10. Windows8.1 + Nvidia cuda8.0 + Vs2015

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Vs2015 1.查看本机配置,查看显卡类型是否支持NVIDIA GPU选中计算机-->右键属性-->设备管理 ...