ThinkPHP 数据库查询
数据库
配置
在数据库配置文件database.php
中我们可以配置,数据库的类型,服务器地址,数据库名,用户名,密码,端口,表前缀等。
参数名 | 描述 | 默认值 |
---|---|---|
type | 数据库类型 | 无 |
hostname | 数据库地址 | 127.0.0.1 |
database | 数据库名称 | 无 |
username | 数据库用户名 | 无 |
password | 数据库密码 | 无 |
hostport | 数据库端口号 | 无 |
dsn | 数据库连接dsn信息 | 无 |
params | 数据库连接参数 | 空 |
charset | 数据库编码 | utf8 |
prefix | 数据库的表前缀 | 无 |
debug | 是否调试模式 | false |
deploy | 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) | 0 |
rw_separate | 数据库读写是否分离 主从式有效 | false |
master_num | 读写分离后 主服务器数量 | 1 |
slave_no | 指定从服务器序号 | 无 |
fields_strict | 是否严格检查字段是否存在 | true |
resultset_type | 数据集返回类型 | array |
auto_timestamp | 自动写入时间戳字段 | false |
sql_explain | 是否需要进行SQL性能分析 开启调试有效 | false |
query | 指定查询对象 | think\db\Query |
其中数据库调试模式开启可以在日志文件中查看执行sql的相关信息。配置信息可以借助Env
进行配置。
数据库查询
数据库查询与三种方式,分别是原生查询,数据库查询,和模型查询。下面会一一介绍。
在查询数据之前,先思考几个小问题:
1、怎么查询一条数据,多条数据,返回值是什么
2、怎么查询一个字段值,一列字段值,返回值是什么
3、怎么插入数据,批量插入,返回值
4、更新某个字段,更新一条数据,更新多条数据
5、实现软删除的手段
6、怎么实现打印sql(fetchSql,select(false))
原生查询
Db类支持原生SQL查询操作,分别是query
方法和execute
方法。
在原生查询的时候使用参数绑定,包括问号占位符或者命名占位符。
-
query 该方法主要用于数据库的查询,如果数据非法或查询错误则返回
false
,否则如果有数据则返回一个二维数组,没数据则返回一个空数组。
例如:Db::query("select * from think_user where id=? AND status=?", [8, 1]);
-
execute 该方法主要用于数据的更新或写入,如果数据错误或查询错误则返回
false
,否则返回受影响的行数。
例如:Db::execute("update think_user set name=:name where status=:status", ['name' => 'thinkphp', 'status' => 1])
数据库查询
注意:table方法参数是数据表的完整的名字,而name方法的参数在配置表前缀的前提下的表名,否则是数据表的完整的名字
- 插入数据
- insert 返回添加成功的条数
Db::name('student')->insert($data);
- insertGetId 返回添加数据的自增主键
Db::name('student')->insertGetId($data);
- insertAll 返回添加成功的条数
//二维数组data数据一次性插入 Db::name('student')->insertAll($data); //二维数组data数据分批次插入,每次插入50条 Db::name('student')->limit(50)->insertAll($data);
究竟我是怎么知道的?把sql打印或者查看日志就明白是怎么回事了。
- insert 返回添加成功的条数
- 查询数据
- find 查询一条数据,如果有数据返回一维数组,没数据的话返回NULL
Db::name('student')->where('id',1)->find();
- select 查询一条数据或多条数据,返回的二维数组,如果没找到数据,返回空数组
Db::name('student')->where('id','>',10)->select();
- value 返回某一字段的值或者NULL
Db::name('student')->where('id',10)->value('name');
- column 返回一列,一维数组或者空数组
Db::name('student')->where('id',10)->column('name');
- find 查询一条数据,如果有数据返回一维数组,没数据的话返回NULL
- 更新数据
- setField 更新字段值,返回影响数据的条数,没修改任何数据字段返回 0
Db::name('user')->where('id',1)->setField('name', 'thinkphp');
- update 方法返回影响数据的条数,没修改任何数据返回 0
Db::name('user')->where('id', 1)->update(['name' => 'thinkphp']);
- setField 更新字段值,返回影响数据的条数,没修改任何数据字段返回 0
- 删除数据
- delete 方法返回影响数据的条数,没有删除返回 0
Db::table('think_user')->where('id','<',10)->delete();
- delete 方法返回影响数据的条数,没有删除返回 0
模型查询
在定义模型之前,先了解常用的模型设置属性:
属性 | 描述 |
---|---|
name | 模型名(默认为当前不含后缀的模型类名) |
table | 数据表名(默认自动获取) |
pk | 主键名(默认为id) |
connection | 数据库连接(默认读取数据库配置) |
query | 模型使用的查询类名称 |
field | 模型对应数据表的字段列表(数组) |
在模型中除了可以调用数据库类的方法之外(换句话说,数据库的所有查询方法模型中都可以支持),可以定义自己的方法,所以也可以把模型看成是数据库的增强版。
模型操作和数据库操作的区别:一是返回结果不同,另外一个显著区别是模型支持包括获取器、修改器、自动完成在内的一系列自动化操作和事件,简化了数据的存取操作。
- 插入数据
新增数据的最佳实践原则:使用create方法新增数据,使用saveAll批量新增数据
1、save 返回影响的记录数,首先实例化模型,然后赋值,最后再save
$user = new User([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
$user->save();
2、saveAll方法新增数据返回的是包含新增模型(带自增ID)的数据集对象
$user = new User;
$list = [
['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
['name'=>'onethink','email'=>'onethink@qq.com']
];
$user->saveAll($list);
3、create方法返回的是当前模型的对象实例
$user = User::create([
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com'
]);
echo $user->id; // 获取自增ID
- 更新
更新的最佳实践原则是:如果需要使用模型事件,那么就先查询后更新,如果不需要使用事件,直接使用静态的Update方法进行条件更新,如非必要,尽量不要使用批量更新。
1、save 更新返回影响的记录数
$user = User::where('status',1)->where('name','liuchen')->find();
$user->name = 'thinkphp';
$user->email = 'thinkphp@qq.com';
$user->save();
2、update更新,数据库的update方法返回影响的记录数,模型的update方法返回模型的对象实例
User::where('id', 1)->update(['name' => 'thinkphp']);
User::update(['id' => 1, 'name' => 'thinkphp']);
- 删除数据
删除的最佳实践原则是:如果删除当前模型数据,用delete方法,如果需要直接删除数据,使用destroy静态方法
User::where('id','>',10)->delete();
- 查询数据
1、模型查询和数据库查询方法的区别主要在于,模型中的查询的数据在获取的时候会经过获取器的处理,以及更加对象化的获取方式
2、模型查询除了使用自身的查询方法外,一样可以使用数据库的查询构造器,返回的都是模型对象实例
3、模型查询的最佳实践原则是:在模型外部使用静态方法进行查询,内部使用动态方法查询,包括使用数据库的查询构造器。模型的查询始终返回对象实例,但可以和数组一样使用
本作品采用《CC 协议》,转载必须注明作者和本文链接