tp5框架之数据库

一、连接数据库

常用的配置方式是在应用目录或者模块目录下面的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 方法操作数据库事务,当发生异常会自动回滚:

  1. 启动事务
 Db::startTrans();
  1. 提交事务
Db::commit(); 
  1. 回滚事务
Db::rollback();

举例:

// 启动事务
Db::startTrans();
try{
    Db::table('fa_user')->find(1);
    Db::table('fak_user')->delete(1);
    // 提交事务
    Db::commit();    
} catch (\Exception $e) {
    // 回滚事务
    Db::rollback();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值