目录
一、连接数据库
常用的配置方式是在应用目录或者模块目录下面的database.php中添加下面的配置参数:
return [
// 数据库类型
'type' => Env::get('database.type', 'mysql'),
// 服务器地址
'hostname' => Env::get('database.hostname', '127.0.0.1'),
// 数据库名
'database' => Env::get('database.database', 'fast'),
// 用户名
'username' => Env::get('database.username', 'root'),
// 密码
'password' => Env::get('database.password', 'root'),
// 端口
'hostport' => Env::get('database.hostport', ''),
// 连接dsn
'dsn' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用 utf8mb4
'charset' => Env::get('database.charset', 'utf8mb4'),
// 数据库表前缀
'prefix' => Env::get('database.prefix', 'fa_'),
// 数据库调试模式
'debug' => Env::get('database.debug', false),
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => true,
// 数据集返回类型
'resultset_type' => 'array',
// 自动写入时间戳字段
'auto_timestamp' => false,
// 时间字段取出后的默认时间格式,默认为Y-m-d H:i:s
'datetime_format' => false,
// 是否需要进行SQL性能分析
'sql_explain' => false,
];
基本使用
配置了数据库连接信息后,我们就可以直接使用数据库运行原生SQL操作了,支持query(查询操作)和execute(写入操作)方法,并且支持参数绑定。
$res = Db::query('select * from fa_user where id=?',[1]);
#$b = Db::execute('insert into fa_user (id, username) values (3, "lwk")');
$c = Db::execute('update fa_user set id=4 where id=?',[2]);
$d = Db::execute('delete from fa_user where id=?',[1]);
dump($res);
#dump($b);
dump($d);
运行结果:
二、查询构造器
1.查询数据
//find返回一维数组 并且是一条数据 (findall多条数据)
$res1 = db('user')->where('id',5)->find();
//select返回二维数组
$res2 = db('user')->where('id',3)->select();
dump($res1);
dump($res2);
//值和列查询
#值
$res3 = db('user')->where('id',3)->value('username');
dump($res3);
#列
$res4 = db('user')->where('id',3)->column('username');
dump($res4);
运行结果:
2.添加数据
$data = ['username' => 'admin', 'mobile' => '13888888888'];
// 添加单条数据
$res1 = db('user')->insert($data);
$list = [
['username' => '1', 'nickname' => 'a'],
['username' => '2', 'nickname' => 'b'],
['username' => '3', 'nickname' => 'c']
];
dump($res1);
// 添加多条数据
$res2 = db('user')->insertAll($list);
dump($res2);
运行结果:
3.更新数据
// 更新数据表中的数据
$res1 = db('user')->where('id',1)->update(['username' => 'thinkphp']);
dump($res1);
// 更新某个字段的值
$res2 = db('user')->where('id',1)->setField('nickname','thinkphp');
dump($res2);
// 自增 score 字段
$res3 = db('user')->where('id', 2)->setInc('id');
dump($res3);
// 自减 score 字段
$res4 = db('user')->where('id', 1)->setDec('id');
dump($res4);
运行结果:
4.删除数据
// 根据主键删除
$res1 = db('user')->delete(10);
dump($res1);
// 条件删除
$res2 = db('user')->where('id',11)->delete();
dump($res2);
运行结果:
5.查询方法
where方法
可以使用where方法进行AND条件查询:
$res1 = Db::table('fa_user')
->where('username','like','%thinkphp')
->where('id',2)
->find();
dump($res1);
运行结果为:
多字段相同条件的AND查询可以简化为如下方式:
$res1 = Db::table('fa_user')
->where('username&nickname','like','%thinkphp')
->find();
dump($res1);
运行结果为:
whereOr方法
使用whereOr方法进行OR查询:
Db::table('fa_user')
->where('username','like','%thinkphp')
->whereOr('nickname','like','%thinkphp')
->find();
多字段相同条件的OR查询可以简化为如下方式:
$res1 = Db::table('fa_user')
->where('username|nickname','like','%thinkphp')
->find();
dump($res1);
运行结果为:
6.查询语句
where('字段名','表达式','查询条件');
whereOr('字段名','表达式','查询条件');
表达式不分大小写,支持的查询表达式有下面几种,分别表示的含义是:
$res1 = db('user')->where('id','>','8')->select();
dump($res1);
运行结果:
7.链式操作
1.where
用于AND查询
$res1 = db('user')
->where('id','>','8')
->where('username','thinkphp')
->select();
dump($res1);
运行结果:
2.table
用于定义要操作的数据表名称
$res1 = db('user')->field('id,username,nickname')->select();
dump($res1);
运行结果:
3.alias
于给当前数据表定义别名
$res1 = db('admin')->alias('a')->join('admin_log l','a.id=l.admin_id','left')->select();
dump($res1);
运行结果:
4.field
用于定义要查询的字段(支持字段排除)
除’username’之外的所有字段值
field('username',true)
$res1 = db('user')->field('id,username,nickname')->select();
dump($res1);
运行结果:
5.order
用于对结果排序
$res1 = Db::table('fa_user')
->where('id','>','10')
->order('id desc')
->limit(5)
->select();
dump($res1);
运行结果:
6.limit
用于限制查询结果数量
$res1 = Db::table('fa_user')
->where('id','>','10')
->order('id desc')
->limit(5)
->select();
dump($res1);
运行结果:
7.page
用于查询分页
$res1 = Db::table('fa_user')
->where('id','>','10')
->page('1,5')
->select();
dump($res1);
运行结果:
8.group
用于分组查询
$res1 = db('admin_log')
->field('id,username,admin_id')
->group('admin_id')
->select();
dump($res1);
运行结果:
在这里插入代码片
运行结果:
9.having
用于从结果中筛选(通常是聚合条件)数据
$res1 = db('admin_log')
->field('id,username,admin_id')
->group('admin_id')
->having('count(id)>3')
->select();
dump($res1);
运行结果:
10.join
用于多表查询
$res1 = db('admin')->alias('a')->join('admin_log l','a.id=l.admin_id','left')->select();
dump($res1);
运行结果:
11.distinct
用于去重
$res1 = db('admin_log')
->distinct(true)
->field('username')
->select();
dump($res1);
运行结果:
12.lock
用于数据库的锁机制
运行结果:
13.fetchSql
用于直接返回SQL而不是执行查询
$res1 = db('admin_log')
->distinct(true)
->field('username')
->fetchSql(true)
->select();
dump($res1);
运行结果:
14.force
用于数据集的强制索引
$res1 = db('admin_log')
->force('username')
->field('username')
->fetchSql(true)
->select();
dump($res1);
运行结果:
子查询
1.构造子查询
1、使用select方法
当select方法的参数为false的时候,表示不进行查询只是返回构建的SQL
$res1 = db('user')
->field('id')
->where('id','>','8')
->select(false);
dump($res1);
运行结果:
2、使用fetchSql方法
fetchSql方法表示不进行查询而只是返回构建的SQL语句
$res1 = db('user')
->field('id')
->where('id','>','8')
->fetchSql()
->select();
dump($res1);
运行结果:
3、使用buildSql构造子查询
生成该次查询的SQL语句(为了避免混淆,会在SQL两边加上括号),不会进行实际的查询操作。
$res1 = db('user')
->field('id')
->where('id','>','8')
->buildSql();
dump($res1);
运行结果:
2.子查询
$res1 = db('user')
->field('id,username')
->where('id','>','8')
->buildSql();
$res2 = db($res1.' a')
->where('a.username','like','thinkphp')
->order('id','desc')
->fetchSql()
->select();
dump($res2);
运行结果:
三、查询事件
注册事件
使用下面的方法注册数据库查询事件
Query::event('after_insert','callback');
Query::event('before_select',function($options,$query){
// 事件处理
return $result;
});
四、事务操作
需要使用 InnoDB 引擎, MyISAM 不支持事务处理.
注意:事务一般不进行dql查询操作,经常用于2条及以上dml操作语句。
使用 transaction 方法操作数据库事务,当发生异常会自动回滚:
- 启动事务
Db::startTrans();
- 提交事务
Db::commit();
- 回滚事务
Db::rollback();
举例:
// 启动事务
Db::startTrans();
try{
Db::table('fa_user')->find(1);
Db::table('fak_user')->delete(1);
// 提交事务
Db::commit();
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
}