数据库
配置
在数据库配置文件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打印或者查看日志就明白是怎么回事了。
查询数据
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');
更新数据
setField 更新字段值,返回影响数据的条数,没修改任何数据字段返回 0
Db::name('user')->where('id',1)->setField('name', 'thinkphp');
update 方法返回影响数据的条数,没修改任何数据返回 0
Db::name('user')->where('id', 1)->update(['name' => 'thinkphp']);
删除数据
delete 方法返回影响数据的条数,没有删除返回 0
Db::table('think_user')->where('id','delete();
模型查询
在定义模型之前,先了解常用的模型设置属性:
属性
描述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 协议》,转载必须注明作者和本文链接
趁还没掉光,赶紧给每根头发起个名字吧~