数据库操作
如果应用需要使用数据库,必须配置数据库连接信息,数据库的配置文件有多种定义方式
config\database.php
return [
'default' => 'mysql',
'connections' => [
'mysql' => [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'thinkphp',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
],
],
];
查询构造器
可以更方便执行数据库操作,查询构造器基于PDO实现,对不同的数据库驱动都是统一的语法
查询数据
<?php
namespace app\index\controller;
// 引用Db类
use think\facade\Db;
class index
{
// 查询数据
public function index()
{
$UserList = Db::table('pre_admin')->select();
halt($adminList);
// 查询某条数据
$user = Db::table('think_user')->where('status', 1)->select();
halt($UserList);
// 如果设置了数据表前缀参数
Db::name('user')->where('id', 1)->find();
Db::name('user')->where('status', 1)->select();
// 如果希望查询数据不存在的时候返回空数组
Db::table('think_user')->where('id', 1)->findOrEmpty();
// 查询某个字段的值可以用
Db::table('think_user')->where('id', 1)->value('name');
// 查询某一列的值可以用
// 返回数组
Db::table('think_user')->where('status',1)->column('name');
// 指定id字段的值作为索引
Db::table('think_user')->where('status',1)->column('name', 'id');
}
}
添加数据
<?php
namespace app\index\controller;
// 引用Db类
use think\facade\Db;
class index
{
// 添加数据
public function add()
{
// save方法 自动判断是新增还是更新数据(判断是否更新是看条件有主键)
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->save($data);
// insert 方法向数据库提交数据
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->insert($data);
// 添加多条数据
$data = [
['foo' => 'bar', 'bar' => 'foo'],
['foo' => 'bar1', 'bar' => 'foo1'],
['foo' => 'bar2', 'bar' => 'foo2']
];
Db::name('user')->insertAll($data);
// 添加数据后如果需要返回新增数据的自增主键
$userId = Db::name('user')->insertGetId($data);
dump($userId);
}
}
更新数据
<?php
namespace app\index\controller;
// 引用Db类
use think\facade\Db;
class index
{
public function edit()
{
// save方法 自动判断是新增还是更新数据(判断是否更新是看条件有主键)
Db::name('user')->save(['id' => 1, 'name' => 'thinkphp']);
// update方法
Db::name('user')->where('id', 1)->update(['name' => 'thinkphp']);
// 如果数据中包含主键,可以直接使用
Db::name('user')->update(['name' => 'thinkphp','id' => 1]);
// 自增/自减 inc/dec方法自增或自减一个字段的值( 如不加第二个参数,默认步长为1)
// score 字段加 5
Db::table('think_user')
->where('id', 1)
->inc('score', 5)
->update();
// score 字段减 5
Db::table('think_user')
->where('id', 1)
->dec('score', 5)
->update();
}
}
删除数据
<?php
namespace app\index\controller;
namespace app\index\controller;
// 引用Db类
use think\facade\Db;
class index
{
public function del()
{
// 根据主键删除
Db::table('think_user')->delete(1);
Db::table('think_user')->delete([1,2,3]);
// 条件删除
Db::table('think_user')->where('id',1)->delete();
Db::table('think_user')->where('id','<',10)->delete();
// 软删除数据 使用delete_time字段标记删除
Db::name('user')
->where('id', 1)
->useSoftDelete('delete_time',time())
->delete();
}
}
查询表达式
查询表达式支持大部分的SQL查询语法,也是ThinkPHP查询语言的精髓,除了where方法外,还可以支持whereOr,查询表达式的使用格式
where('字段名','查询表达式','查询条件');
表达式不分大小写,支持的查询表达式有下面几种
表达式 | 含义 | 快捷查询方法 |
---|---|---|
= | 等于 | |
<> | 不等于 | |
> | 大于 | |
>= | 大于等于 | |
< | 小于 | |
<= | 小于等于 | |
[NOT] LIKE | 模糊查询 | whereLike /whereNotLike |
[NOT] BETWEEN | (不在)区间查询 | whereBetween /whereNotBetween |
[NOT] IN | (不在)IN 查询 | whereIn /whereNotIn |
[NOT] NULL | 查询字段是否(不)是NULL | whereNull /whereNotNull |
[NOT] BETWEENTIME | 时间区间比较 | whereBetweenTime |
> TIME | 大于某个时间 | whereTime |
< TIME | 小于某个时间 | whereTime |
>= TIME | 大于等于某个时间 | whereTime |
<= TIME | 小于等于某个时间 | whereTime |
EXP | 表达式查询,支持SQL语法 | whereExp |
find in set | FIND_IN_SET查询 | whereFindInSet |
用法示例
// 等于
Db::name('user')->where('id','=',100)->select();
// 不等于
Db::name('user')->where('id','<>',100)->select();
// 大于
Db::name('user')->where('id','>',100)->select();
// 大于等于
Db::name('user')->where('id','>=',100)->select();
// 小于
Db::name('user')->where('id', '<', 100)->select();
// 小于等于
Db::name('user')->where('id', '<=', 100)->select();
// EXP 表达式
Db::name('user')->where('id','exp',' IN (1,3,8) ')->select();
链式操作
支持链式操作的查询方法包括
方法名 | 描述 |
---|---|
alias | 设置表别名 |
field | 查询字段 |
limit | 指定查询多条数据 |
order | 排序 |
group | 根据一个或多个列对结果集进行分组 |
join | 根据两个或多个表中的列之间的关系 |
fetchSql | 直接返回SQL而不是执行查询 |
用法示例
// 链表查询
Db::table('think_user')
->alias('a')
->join('think_dept b ','b.user_id= a.id')
->select();
// 按照用户id进行分组统计
Db::table('user')
->field('user_id,username,max(score)')
->group('user_id')
->select();
// 查询5个满足条件的数据 并按照id倒序排列
Db::table('user')
->where('status', 1)
->field('id,name')
->order('id', 'desc')
->limit(5)
->select();
聚合查询
经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等
方法 | 说明 |
---|---|
count | 统计数量,参数是要统计的字段名(可选) |
max | 获取最大值,参数是要统计的字段名(必须) |
min | 获取最小值,参数是要统计的字段名(必须) |
avg | 获取平均值,参数是要统计的字段名(必须) |
sum | 获取总分,参数是要统计的字段名(必须) |
用法示例
// 获取用户数
Db::table('think_user')->count();
// 获取用户的最大积分
Db::table('think_user')->max('score');
分页
ThinkPHP
内置了分页实现,要给数据添加分页输出功能变得非常简单,查询的时候调用paginate
方法
// 查询状态为1的用户数据 并且每页显示10条数据
$list = Db::name('user')->where('status',1)->order('id', 'desc')->paginate(10);
// 渲染模板输出
return view('index', ['list' => $list]);
模板文件中分页输出代码如下
<div>
<ul>
{volist name='list' id='user'}
<li> {$user.nickname}</li>
{/volist}
</ul>
</div>
{$list|raw}
也可以单独赋值分页输出的模板变量
// 查询状态为1的用户数据 并且每页显示10条数据
$list = Db::name('user')->where('status',1)->order('id', 'desc')->paginate(10);
// 获取分页显示
$page = $list->render();
return view('index', ['list' => $list, 'page' => $page]);
模板文件中分页输出代码如下
<div>
<ul>
{volist name='list' id='user'}
<li> {$user.nickname}</li>
{/volist}
</ul>
</div>
{$page|raw}
事务操作
最简单的方式是使用transaction
方法操作数据库事务,当闭包中的代码发生异常会自动回滚
// 写入失败的话,系统会自动回滚,写入成功的话系统会自动提交当前事务
Db::transaction(function () {
Db::table('think_user')->find(1);
Db::table('think_user')->delete(1);
});
也可以手动控制事务
// 启动事务
Db::startTrans();
try {
Db::table('think_user')->find(1);
Db::table('think_user')->delete(1);
// 提交事务
Db::commit();
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
}