数据库操作

如果应用需要使用数据库,必须配置数据库连接信息,数据库的配置文件有多种定义方式

config\database.php

return [
    'default'    =>    'mysql',
    'connections'    =>    [
        'mysql'    =>    [
            // 数据库类型
            'type'        => 'mysql',
            // 服务器地址
            'hostname'    => '127.0.0.1',
            // 数据库名
            'database'    => 'thinkphp',
            // 数据库用户名
            'username'    => 'root',
            // 数据库密码
            'password'    => '',
            // 数据库连接端口
            'hostport'    => '',
            // 数据库连接参数
            'params'      => [],
            // 数据库编码默认采用utf8
            'charset'     => 'utf8',
            // 数据库表前缀
            'prefix'      => 'think_',
        ],
    ],
];

查询构造器

可以更方便执行数据库操作,查询构造器基于PDO实现,对不同的数据库驱动都是统一的语法

查询数据

<?php

namespace app\index\controller;

// 引用Db类
use think\facade\Db;

class index
{
    // 查询数据
    public function index()
    {
        $UserList = Db::table('pre_admin')->select();
        halt($adminList);

        // 查询某条数据
        $user = Db::table('think_user')->where('status', 1)->select();
        halt($UserList);

        // 如果设置了数据表前缀参数
        Db::name('user')->where('id', 1)->find();
        Db::name('user')->where('status', 1)->select();

        // 如果希望查询数据不存在的时候返回空数组
        Db::table('think_user')->where('id', 1)->findOrEmpty();

        // 查询某个字段的值可以用
        Db::table('think_user')->where('id', 1)->value('name');

        // 查询某一列的值可以用
        // 返回数组
        Db::table('think_user')->where('status',1)->column('name');
        // 指定id字段的值作为索引
        Db::table('think_user')->where('status',1)->column('name', 'id');

    }

}

添加数据

<?php

namespace app\index\controller;

// 引用Db类
use think\facade\Db;

class index
{
    // 添加数据
    public function add()
    {
        // save方法 自动判断是新增还是更新数据(判断是否更新是看条件有主键)
        $data = ['foo' => 'bar', 'bar' => 'foo'];
        Db::name('user')->save($data);

        // insert 方法向数据库提交数据
        $data = ['foo' => 'bar', 'bar' => 'foo'];
        Db::name('user')->insert($data);

        // 添加多条数据
        $data = [
            ['foo' => 'bar', 'bar' => 'foo'],
            ['foo' => 'bar1', 'bar' => 'foo1'],
            ['foo' => 'bar2', 'bar' => 'foo2']
        ];
        Db::name('user')->insertAll($data);

        // 添加数据后如果需要返回新增数据的自增主键
        $userId = Db::name('user')->insertGetId($data);
        dump($userId);
    }
}

更新数据

<?php

namespace app\index\controller;

// 引用Db类
use think\facade\Db;

class index
{
    public function edit()
    {
        // save方法 自动判断是新增还是更新数据(判断是否更新是看条件有主键)
        Db::name('user')->save(['id' => 1, 'name' => 'thinkphp']);
        // update方法
        Db::name('user')->where('id', 1)->update(['name' => 'thinkphp']);
        // 如果数据中包含主键,可以直接使用
        Db::name('user')->update(['name' => 'thinkphp','id' => 1]);
        // 自增/自减 inc/dec方法自增或自减一个字段的值( 如不加第二个参数,默认步长为1)
        // score 字段加 5
        Db::table('think_user')
            ->where('id', 1)
            ->inc('score', 5)
            ->update();
        // score 字段减 5
        Db::table('think_user')
            ->where('id', 1)
            ->dec('score', 5)
            ->update();
    }
}

删除数据

<?php

namespace app\index\controller;

namespace app\index\controller;

// 引用Db类
use think\facade\Db;

class index
{
   public function del()
   {
        // 根据主键删除
        Db::table('think_user')->delete(1);
        Db::table('think_user')->delete([1,2,3]);

        // 条件删除    
        Db::table('think_user')->where('id',1)->delete();
        Db::table('think_user')->where('id','<',10)->delete();

        // 软删除数据 使用delete_time字段标记删除
        Db::name('user')
            ->where('id', 1)
            ->useSoftDelete('delete_time',time())
            ->delete();
   }
}

查询表达式

查询表达式支持大部分的SQL查询语法,也是ThinkPHP查询语言的精髓,除了where方法外,还可以支持whereOr,查询表达式的使用格式

where('字段名','查询表达式','查询条件');

表达式不分大小写,支持的查询表达式有下面几种

表达式 含义 快捷查询方法
= 等于
<> 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
[NOT] LIKE 模糊查询 whereLike/whereNotLike
[NOT] BETWEEN (不在)区间查询 whereBetween/whereNotBetween
[NOT] IN (不在)IN 查询 whereIn/whereNotIn
[NOT] NULL 查询字段是否(不)是NULL whereNull/whereNotNull
[NOT] BETWEENTIME 时间区间比较 whereBetweenTime
> TIME 大于某个时间 whereTime
< TIME 小于某个时间 whereTime
>= TIME 大于等于某个时间 whereTime
<= TIME 小于等于某个时间 whereTime
EXP 表达式查询,支持SQL语法 whereExp
find in set FIND_IN_SET查询 whereFindInSet

用法示例

// 等于
Db::name('user')->where('id','=',100)->select();

// 不等于
Db::name('user')->where('id','<>',100)->select();

// 大于
Db::name('user')->where('id','>',100)->select();

// 大于等于
Db::name('user')->where('id','>=',100)->select();

// 小于
Db::name('user')->where('id', '<', 100)->select();

// 小于等于
Db::name('user')->where('id', '<=', 100)->select();

// EXP 表达式
Db::name('user')->where('id','exp',' IN (1,3,8) ')->select();

链式操作

支持链式操作的查询方法包括

方法名 描述
alias 设置表别名
field 查询字段
limit 指定查询多条数据
order 排序
group 根据一个或多个列对结果集进行分组
join 根据两个或多个表中的列之间的关系
fetchSql 直接返回SQL而不是执行查询

用法示例

// 链表查询
Db::table('think_user')
    ->alias('a')
    ->join('think_dept b ','b.user_id= a.id')
    ->select();

// 按照用户id进行分组统计
Db::table('user')
    ->field('user_id,username,max(score)')
    ->group('user_id')
    ->select();

// 查询5个满足条件的数据 并按照id倒序排列
Db::table('user')
    ->where('status', 1)
    ->field('id,name')
    ->order('id', 'desc')
    ->limit(5)
    ->select();

聚合查询

经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等

方法 说明
count 统计数量,参数是要统计的字段名(可选)
max 获取最大值,参数是要统计的字段名(必须)
min 获取最小值,参数是要统计的字段名(必须)
avg 获取平均值,参数是要统计的字段名(必须)
sum 获取总分,参数是要统计的字段名(必须)

用法示例

// 获取用户数
Db::table('think_user')->count();

// 获取用户的最大积分
Db::table('think_user')->max('score');

分页

ThinkPHP内置了分页实现,要给数据添加分页输出功能变得非常简单,查询的时候调用paginate方法

// 查询状态为1的用户数据 并且每页显示10条数据
$list = Db::name('user')->where('status',1)->order('id', 'desc')->paginate(10);

// 渲染模板输出
return view('index', ['list' => $list]);

模板文件中分页输出代码如下

<div>
    <ul>
        {volist name='list' id='user'}
            <li> {$user.nickname}</li>
        {/volist}
    </ul>
</div>
{$list|raw}

也可以单独赋值分页输出的模板变量

// 查询状态为1的用户数据 并且每页显示10条数据
$list = Db::name('user')->where('status',1)->order('id', 'desc')->paginate(10);

// 获取分页显示
$page = $list->render();

return view('index', ['list' => $list, 'page' => $page]);

模板文件中分页输出代码如下

<div>
    <ul>
    {volist name='list' id='user'}
        <li> {$user.nickname}</li>
    {/volist}
    </ul>
</div>
{$page|raw}

事务操作

最简单的方式是使用transaction方法操作数据库事务,当闭包中的代码发生异常会自动回滚

// 写入失败的话,系统会自动回滚,写入成功的话系统会自动提交当前事务
Db::transaction(function () {
    Db::table('think_user')->find(1);
    Db::table('think_user')->delete(1);
});

也可以手动控制事务

// 启动事务
Db::startTrans();
try {
    Db::table('think_user')->find(1);
    Db::table('think_user')->delete(1);
    // 提交事务
    Db::commit();
} catch (\Exception $e) {
    // 回滚事务
    Db::rollback();
}
powered by GitbookEdit Time: 2023-04-08 10:28:32