TP 5数据库

一、连接数据库

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);
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值