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打印或者查看日志就明白是怎么回事了。

  • 查询数据
    • 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','<',10)->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 协议》,转载必须注明作者和本文链接
今年不学习,明天惨唧唧。
zs4336
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!