模型提供了多种方法来查询数据:
- find 查询单条数据
- select 查询多条数据
- count 查询总条数
- countSelect 分页查询数据
- max 查询字段的最大值
- avg 查询字段的平均值
- min 查询字段的最小值
- sum 对字段值进行求和
- getField 查询指定字段的值
1)find 查询单条语句
model.find(options)
options
{Object} 操作选项,会通过 parseOptions 方法解析return
{Promise} 返回单条数据
查询单条数据,返回的数据类型为对象。如果未查询到相关数据,返回值为 {}
。
module.exports=class extends think.Controller{
async listAction(){
let model =this.model('user');
let data=await model.where({name: 'thinkjs'}).find();
//data returns {name: 'thinkjs', email: 'admin@thinkjs.org,...'}
if(think.isEmpty(data)){
//内容为空时的处理
}
}
}
可通过think.isEmpty 方法判断返回值是否为空。
2)select查询多条语句
model.select(options)
- options{Object} 操作选项
- return{Promise} 返回多条数据
查询多条数据,返回的数据类型为数组。如未查询到相关数据,返回值为[ ].
module.exports=class extends think.Controller {
async listAction(){
let model=this.model('user');
let data=await model.limit(2).select();
//data returns [{name:'thinkjs',email: 'admin@thinkjs.org'},...]
if(think.isEmpty(data)){
}
}
}
可通过think.isEmpty方法判断返回值是否为空。
3)count 返回总条数
model.count(field)
- field{String} 字段名,如果不指定那么值为 *
- return{Promise} 返回总条数
获取总条数。
module.exports = class extends think.Model{
//获取字段值之和
getScoreCount(){
//SELECT COUT (score) AS think_count FROM 'test_d' LIMIT 1
return this.count('score');
}
}
model.sum(field)
- field{String} 字段名
- return{Promise} 返回总条数
对字段值进行求和。
module.exports = class extends think.Model{
//获取字段值之和
getScoreCount(){
//SELECT SUM(score) AS think_sum FROM 'test_d' LIMIT 1
return this.sum('score');
}
}
model.min(field)
- field{String} 字段名
- return{Promise}
求字段的最小值。
module.exports = class extends think.Model{
//获取字段最小值
getScoreMin(){
//SELECT MIN (score) AS think_min FROM 'test_d' LIMIT 1
return this.min('score');
}
}
model.max(field)
- field{String} 字段名
- return{Promise}
求字段的最大值。
module.exports = class extends think.Model{
//获取字段最大值
getScoreMax(){
//SELECT MAX (score) AS think_max FROM 'test_d' LIMIT 1
return this.max('score');
}
}
model.avg(field)
- field{String} 字段名
- return{Promise}
求字段的平均值。
module.exports = class extends think.Model{
//获取平均分
getScoreCount(){
//SELECT AVG (score) AS think_avg FROM 'test_d' LIMIT 1
return this.avg('score');
}
}
4) getField 查询指定字段的值
model.getField(field,num)
- field{String} 字段名,多个字段用逗号隔开
- num {Boolean |Number} 需要的条数
- return{Promise}
获取特定字段的值,可以设置where/group等条件
获取单个字段的所有列表
module.exports = class extends think.Controller{
async listAction(){
const data=await this.model('user').getField('c_id');
//data=[1,2,3,4,5]
}
}
指定个数获取单个字段的列表
module.exports = class extends think.Controller{
async listAction(){
const data=await this.model('user').getField('c_id',3);
//data=[1,2,3]
}
}
获取单个字段的一个值
module.exports = class extends think.Controller{
async listAction(){
const data=await this.model('user').getField('c_id',true);
//data=1
}
}
获取多个字段的所有列表
module.exports = class extends think.Controller{
async listAction(){
const data=await this.model('user').getField('c_id,d_name');
//data={c_id: [1,2,3,4,5], d_name:[ 'a', 'b', 'c' ,'d' ,'e']}
}
}
获取指定个数的多个字段的所有列表
module.exports = class extends think.Controller{
async listAction(){
const data=await this.model('user').getField('c_id,d_name,3');
//data={c_id: [1,2,3], d_name:[ 'a', 'b', 'c' ]}
}
}
获取多个字段的单一值
module.exports = class extends think.Controller{
async listAction(){
const data=await this.model('user').getField('c_id,d_name',true);
//data={c_id: 1, d_name: 'a'}
}
}
5)countSelect 分页查询数据
model.countSelect(options,pageFlag)
- options{Number|Object}操作选项,会通过parseOptions方法解析
- pageFlag{Boolean}当页数不合法时处理,true为修正到第一页,false为修正到最后一页,默认不修正
- return{Promise}
分页查询,一般需要结合page方法一起使用。
module.exports = class extends think.Controller{
async listAction(){
let model =this.model('user');
let data=await model.page(this.get('page')).countSelect();
}
}
返回值结构如下:
{
pageSize: 10, //每页显示的条数, think-model@1.1.8 之前该字段为 pagesize
currentPage: 1, //当前页
count: 100, //总条数
totalPages: 10, //总页数
data: [{ //当前页下的数据列表
name: "thinkjs",
email: "admin@thinkjs.org"
}, ...]
}
有时候总条数是放在其他表存储的,不需要再查当前表获取总条数了,这个时候可以通过将第一个参数 options
设置为总条数来查询
module.exports = class extends think.Controller {
async listAction(){
const model = this.model('user');
const total = 256;
// 指定总条数查询
const data = await model.page(this.get('page')).countSelect(total);
}
}