ThinkPHP6.0数据库操作

查询数据

查询单个数据

查询单个数据使用find方法:

// table方法必须指定完整的数据表名
Db::table('think_user')->where('id', 1)->find();

find方法查询结果不存在,返回 null,否则返回结果数组;
如果希望在没有找到数据后抛出异常可以使用

Db::table('think_user')->where('id', 1)->findOrFail();

如果没有查找到数据,则会抛出一个think\db\exception\DataNotFoundException异常。

查询数据集

查询多个数据(数据集)使用select方法:

Db::table('think_user')->where('status', 1)->select();

select 方法查询结果是一个数据集对象,如果需要转换为数组可以使用

Db::table('think_user')->where('status', 1)->select()->toArray();

值和列查询

查询某个字段的值可以用

// 返回某个字段的值
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');

添加数据

添加一条数据·

可以使用save方法统一写入数据,自动判断是新增还是更新数据(以写入数据中是否存在主键数据为依据)。

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->save($data);

或者使用 insert 方法向数据库提交数据

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->insert($data);

insert 方法添加数据成功返回添加成功的条数,通常情况返回 1。
如果你的数据表里面没有foo或者bar字段,那么就会抛出异常。
如果不希望抛出异常,可以使用下面的方法:

$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::name('user')->strict(false)->insert($data);

添加数据后如果需要返回新增数据的自增主键,可以使用insertGetId方法新增数据并返回主键值:

$userId = Db::name('user')->insertGetId($data);

insertGetId 方法添加数据成功返回添加数据的自增主键。

添加多条数据

添加多条数据直接向 Db 类的 insertAll 方法传入需要添加的数据(通常是二维数组)即可。

$data = [
    ['foo' => 'bar', 'bar' => 'foo'],
    ['foo' => 'bar1', 'bar' => 'foo1'],
    ['foo' => 'bar2', 'bar' => 'foo2']
];
Db::name('user')->insertAll($data);

insertAll方法添加数据成功返回添加成功的条数。

更新数据

可以使用save方法更新数据

Db::name('user')
    ->save(['id' => 1, 'name' => 'thinkphp']);

或者使用update方法。

Db::name('user')
    ->where('id', 1)
    ->update(['name' => 'thinkphp']);

update方法返回影响数据的条数,没修改任何数据返回 0。
如果要更新的数据需要使用SQL函数或者其它字段,可以使用下面的方式:

Db::name('user')
    ->where('id',1)
    ->exp('name','UPPER(name)')
    ->update();

自增/自减

可以使用inc/dec方法自增或自减一个字段的值( 如不加第二个参数,默认步长为1)。

// score 字段加 1
Db::table('think_user')
    ->where('id', 1)
    ->inc('score')
    ->update();

// score 字段加 5
Db::table('think_user')
    ->where('id', 1)
    ->inc('score', 5)
    ->update();

// score 字段减 1
Db::table('think_user')
    ->where('id', 1)
    ->dec('score')
    ->update();

// score 字段减 5
Db::table('think_user')
    ->where('id', 1)
    ->dec('score', 5)
    ->update();

软删除数据

一般情况下,业务数据不建议真实删除数据,系统提供了软删除机制(模型中使用软删除更为方便)。

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

实际生成的SQL语句可能如下(执行的是UPDATE操作):

UPDATE `think_user`  SET `delete_time` = '1515745214'  WHERE  `id` = 1

useSoftDelete方法表示使用软删除,并且指定软删除字段为delete_time,写入数据为当前的时间戳。

查询表达式

查询表达式支持大部分的SQL查询语法,也是ThinkPHP查询语言的精髓,查询表达式的使用格式:

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

例如:

Db::name('user')->where('name', 'like', 'thinkphp%')->select();

最终生成的SQL语句是:

SELECT * FROM `think_user` WHERE  `name` LIKE 'thinkphp%'

链式操作

数据库提供的链式操作方法,可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作(原生查询不支持链式操作)。

使用也比较简单,假如我们现在要查询一个User表的满足状态为1的前10条记录,并希望按照用户的创建时间排序 ,代码如下:

Db::table('think_user')
    ->where('status',1)
    ->order('create_time')
    ->limit(10)
    ->select();

每次Db类的静态方法调用是创建一个新的查询对象实例,如果你需要多次复用使用链式操作值,可以使用下面的方法。

$user = Db::table('user');
$user->order('create_time')
    ->where('status',1)
    ->select();
    
// 会自动带上前面的where条件和order排序的值    
$user->where('id', '>', 0)->select();

聚合查询

在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,.获取用户数:

Db::table('think_user')->count();

分页查询

ThinkPHP内置了分页实现,要给数据添加分页输出功能变得非常简单,可以直接在Db类查询的时候调用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}

传入总记录数

***支持传入总记录数而不会自动进行总数计算,例如:

// 查询状态为1的用户数据 并且每页显示10条数据 总记录数为1000
$list = Db::name('user')->where('status',1)->paginate(10,1000);
// 获取分页显示
$page = $list->render();
return view('index', ['list' => $list, 'page' => $page]);

对于UNION查询以及一些特殊的复杂查询,推荐使用这种方式首先单独查询总记录数,然后再传入分页方法***

分页后数据处理

支持分页类后数据直接each遍历处理,方便修改分页后的数据,而不是只能通过模型的获取器来补充字段。

$list = Db::name('user')->where('status',1)->order('id', 'desc')->paginate()->each(function($item, $key){
    $item['nickname'] = 'think';
    return $item;
});

如果是模型类操作分页数据的话,each方法的闭包函数中不需要使用返回值,例如:

$list = User::where('status',1)->order('id', 'desc')->paginate()->each(function($item, $key){
    $item->nickname = 'think';
});

大数据分页

对于大量数据的分页查询,系统提供了一个高性能的paginateX分页查询方法,用法和paginate分页查询存在一定区别。如果你要分页查询的数据量在百万级以上,使用paginateX方法会有明显的提升,尤其是在分页数较大的情况下。并且由于针对大数据量而设计,该分页查询只能采用简洁分页模式,所以没有总数。
分页查询的排序字段一定要使用索引字段,并且是连续的整型,否则会有数据遗漏。

主要场景是针对主键进行分页查询,默认使用主键倒序查询分页数据。

$list = Db::name('user')->where('status',1)->paginateX(20);

也可以在查询的时候可以指定主键和排序

$list = Db::name('user')->where('status',1)->paginateX(20, 'id', 'desc');

查询方法会执行两次查询,第一次查询用于查找满足当前查询条件的最大或者最小值,然后配合主键查询条件来进行分页数据查询。

时间查询

使用whereTime方法
whereTime方法提供了日期和时间字段的快捷查询,示例如下:

// 大于某个时间
Db::name('user')
    ->whereTime('birthday', '>=', '1970-10-1')
    ->select();
// 小于某个时间
Db::name('user')
    ->whereTime('birthday', '<', '2000-10-1')
    ->select();
// 时间区间查询
Db::name('user')
    ->whereTime('birthday', 'between', ['1970-10-1', '2000-10-1'])
    ->select();
// 不在某个时间区间
Db::name('user')
    ->whereTime('birthday', 'not between', ['1970-10-1', '2000-10-1'])
    ->select();

查询某个时间区间
针对时间的区间查询,系统还提供了whereBetweenTime/whereNotBetweenTime快捷方法。

// 查询2017年上半年注册的用户
Db::name('user')
    ->whereBetweenTime('create_time', '2017-01-01', '2017-06-30')
    ->select();
    
// 查询不是2017年上半年注册的用户
Db::name('user')
    ->whereNotBetweenTime('create_time', '2017-01-01', '2017-06-30')
    ->select();
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值