查询数据
查询单个数据
查询单个数据使用find方法:
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');
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)。
Db::table('think_user')
->where('id', 1)
->inc('score')
->update();
Db::table('think_user')
->where('id', 1)
->inc('score', 5)
->update();
Db::table('think_user')
->where('id', 1)
->dec('score')
->update();
Db::table('think_user')
->where('id', 1)
->dec('score', 5)
->update();
软删除数据
一般情况下,业务数据不建议真实删除数据,系统提供了软删除机制(模型中使用软删除更为方便)。
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();
$user->where('id', '>', 0)->select();
聚合查询
在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,.获取用户数:
Db::table('think_user')->count();
分页查询
ThinkPHP内置了分页实现,要给数据添加分页输出功能变得非常简单,可以直接在Db类查询的时候调用paginate方法:
$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}
也可以单独赋值分页输出的模板变量
$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}
传入总记录数
***支持传入总记录数而不会自动进行总数计算,例如:
$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快捷方法。
Db::name('user')
->whereBetweenTime('create_time', '2017-01-01', '2017-06-30')
->select();
Db::name('user')
->whereNotBetweenTime('create_time', '2017-01-01', '2017-06-30')
->select();
|