一、连接数据库
1.配置文件定义
常用的配置方式是在应用目录或者模块目录下面的database.php中添加下面的配置参数:
return [
// 数据库类型
'type' => 'mysql',
// 数据库连接DSN配置
'dsn' => '',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'thinkphp',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
// 数据库调试模式
'debug' => false,
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => true,
];
2.方法配置
可以在调用Db类的时候动态定义连接信息
Db::connect([
// 数据库类型
'type' => 'mysql',
// 数据库连接DSN配置
'dsn' => '',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'thinkphp',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
]);
或者使用字符串方式:
Db::connect('mysql://root:1234@127.0.0.1:3306/thinkphp#utf8');
字符串连接的定义格式为: 数据库类型://用户名:密码@数据库地址:数据库端口/数据库名#字符集
3.模型类定义
如果在某个模型类里面定义了connection属性的话,则该模型操作的时候会自动连接给定的数据库连接,而不是配置文件中设置的默认连接信息,通常用于某些数据表位于当前数据库连接之外的其它数据库
//在模型里单独设置数据库连接信息namespace app\index\model;
use think\Model;
class User extends Model
{
protected $connection = [
// 数据库类型
'type' => 'mysql',
// 数据库连接DSN配置
'dsn' => '',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库名
'database' => 'thinkphp',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库连接端口
'hostport' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'think_',
];
}
二、使用
配置了数据库连接信息后,我们就可以直接使用数据库运行原生SQL操作了,支持query(查询操作)和execute(写入操作)方法,并且支持参数绑定。
三、查询构造器
1.增删改查
数据库信息
(1)查询数据
查询一个数据使用:
// table方法必须指定完整的数据表名
Db::table('think_user')->where('id',1)->find();
//find 方法查询结果不存在,返回 null
查询成功
查询失败
$res =Db::table('fa_cshi')->where('id', 8)->find();
查询数据集使用:
Db::table('think_user')->where('id',9)->select();
//select 方法查询结果不存在,返回空数组
查询失败
查询成功
如果设置了数据表前缀参数的话,可以使用
Db::name('user')->where('id',1)->find();
Db::name('user')->where('id',1)->select();
助手函数实现:
db('user')->where('id',1)->find();
db('user')->where('id',1)->select();
(2)添加数据
添加一条数据
使用 Db 类的 insert 方法向数据库提交数据
$data = ['id' => '8', 'name' => 'foo','groupid'=>'4','sex'=>'女','age'=>'18'];
$res = Db::table('fa_cshi')->insert($data);
dump($res);
insert 方法添加数据成功返回添加成功的条数,insert 正常情况返回 1
添加数据后如果需要返回新增数据的自增主键,可以使用getLastInsID方法:
$userId = Db::name('user')->getLastInsID();
或者直接使用insertGetId方法新增数据并返回主键值:
Db::name('user')->insertGetId($data);
insertGetId 方法添加数据成功返回添加数据的自增主键
添加多条数据直接向 Db 类的 insertAll 方法传入需要添加的数据即可
insertAll 方法添加数据成功返回添加成功的条数
Db::name('user')->insertAll($data);
助手函数
// 添加单条数据
db('user')->insert($data);
// 添加多条数据
db('user')->insertAll($list)
(3)更新数据
update 方法返回影响数据的条数,没修改任何数据返回 0
Db::table('fa_cshi')->where('id', 1)->update(['name' => 'thinkphp']);
更新成功
(4)删除数据
// 根据主键删除
Db::table('fa_cshi')->delete(1);
Db::table('fa_cshi')->delete([1,2,3]);
// 条件删除
Db::table('fa_cshi')->where('id',1)->delete();
Db::table('fa_cshi')->where('id','<',10)->delete();
delete 方法返回影响数据的条数,没有删除返回 0
// 根据主键删除
db('fa_cshi')->delete(1);
// 条件删除
db('fa_cshi')->where('id',1)->delete();
(5)查询语法
·where('字段名','表达式','查询条件');
whereOr('字段名','表达式','查询条件');
表达式不分大小写,支持的查询表达式有下面几种,分别表示的含义是
2. 链式操作
(1)alias
alias用于设置当前数据表的别名,便于使用其他的连贯操作例如join方法
Db::table('fa_cshi')->alias('a')->join(' think_dept b ','b.user_id= a.id')->select();
等效SQL语句
SELECT * FROM fa_cshi a INNER JOIN think_dept b ON b.user_id= a.id
(2)field
主要目的是标识要返回或者操作的字段,可以用于查询和写入操作
查询
使用field方法指定了查询的结果集中包含id,title,content三个字段的值
Db::table('fa_cshi')->field('id,title,content')->select()
可以在field方法中直接使用函数
Db::table('fa_cshi')->field('id,SUM(score)')->select();
写入
field方法还有一个非常重要的安全功能–字段合法性检测
Db::table('fa_cshi')->field('title,email,content')->insert($data);
合法字段只有title,email和content字段
(3)order
order方法属于模型的连贯操作方法之一,用于对操作的结果排序。
//asc升序 desc 降序
Db::table('fa_cshi')->where('status=1')->order('id desc')->limit(5)->select();
order排序中使用了SQL函数的时候,使用orderRaw方法替代order
Db::table('fa_cshi')->where('status=1')->orderRaw('rand()')->limit(5)->select();
(4)limit
主要用于指定查询和操作的数量,特别在分页查询的时候使用较多。
Db::table('fa_cshi')->limit('0,10')->select();
(5)page
更强的分页查询方法
查询第一页和第二页(假设我们每页输出10条数据)写法如下:
// 查询第一页数据
Db::table('fa_cshi')->limit('0,10')->select();
// 查询第二页数据
Db::table('fa_cshi')->limit('10,10')->select();
如果有page 函数就可以自动算出每个分页的limit参数。
//以下开始数据表名我用 b 表示
// 查询第一页数据
Db::table('b')->page('1,10')->select();
// 查询第二页数据
Db::table('b')->page('2,10')->select();
(6)join
-
INNER JOIN: 等同于 JOIN(默认的JOIN类型),如果表中有至少一个匹配,则返回行 LEFT JOIN:
-
即使右表中没有匹配,也从左表返回所有的行
-
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
-
FULL JOIN: 只要其中一个表中存在匹配,就返回行
返回值 : 对象
Db::table('think_artist')
->alias('a')
->join('w','a.id = w.artist_id')
->join('c','a.card_id = c.id')
->select();
Db::table('b')->join('word w','b.id = w.artist_id','RIGHT')->select()
默认采用INNER JOIN 方式。
(7)fetchSql
fetchSql用于直接返回SQL而不是执行查询,适用于任何的CURD操作方法
$result = Db::table('b')->fetchSql(true)->find(1);
运行结果:
SELECT * FROM b where id = 1
(8) force
force 方法用于数据集的强制索引,操作对查询强制使用user索引,user必须是数据表实际创建的索引名称
`Db::table('think_user')->force('user')->select()`;
3.聚合查询
4.子查询
(1)select方法
当select方法的参数为false的时候,表示不进行查询只是返回构建SQL。
$subQuery = Db::table('fa_cshi')
->field('id,name')
->where('id','>',4)
->select(false);
运行结果
SELECT `id`,`name` FROM `fa_cshi` WHERE `id` > 4
(2)fetchSql方法
fetchSql方法表示不进行查询而只是返回构建的SQL语句,并且不仅仅支持select,而是支持所有的CURD查询。
$subQuery = Db::table('fa_cshi')
->field('id,name')
->where('id','>',4)
->fetchSql(true)
->select();
运行结果
SELECT `id`,`name` FROM `fa_cshi` WHERE `id` > 4
(3)buildSql构造子查询
$subQuery = Db::table('fa_cshi')
->field('id,name')
->where('id','>',4)
->buildSql();
运行结果
( SELECT `id`,`name` FROM `fa_cshi` WHERE `id` > 4 )
Db::table($subQuery.' a')
->where('a.name','like','thinkphp')
->order('id','desc')
->select();
运行结果
SELECT * FROM ( SELECT `id`,`name` FROM `think_user` WHERE `id` >4 ) a WHERE a.name LIKE 'thinkphp' ORDER BY `id` desc
四、事务操作
使用事务处理的话,需要数据库引擎支持事务处理。比如 MySQL 的 MyISAM 不支持事务处理,需要使用 InnoDB 引擎,使用 transaction 方法操作数据库事务,当发生异常会自动回滚。
Db::transaction(function(){
Db::table('think_user')->find(1);
Db::table('think_user')->delete(1);
});
手动控制事务
Db::transaction(function(){
Db::table('think_user')->find(1);
Db::table('think_user')->delete(1);
});