think.model.base
继承自 think.base 类。
export default class extends think.model.base {
getList(){
}
}
module.exports = think.model({
getList: function(){
}
})
数据表主键,默认为 id
。
模型名,默认从当前文件名中解析。
当前文件路径为 for/bar/app/home/model/user.js,那么解析的模型名为 user
。
数据表名称前缀,默认为 think_
。
数据表名称,不包含前缀。默认等于模型名。
数据表字段,默认自动从数据表分析。
数据表索引,关系数据库会自动从数据表分析。
只读字段列表,数据更新时不会更新这些字段。
配置,实例化的时候指定。
连接数据库句柄。
操作的数据。
操作选项。
name
{String} 模型名称options
{Object} 配置项module
{String} 模块名return
{Object}获取模型实例,可以跨模块获取。
export default class extends think.model.base {
async getList(){
//获取 user 模型实例
let instance = this.model('user');
let list = await instance.select();
let ids = list.map(item => {
return item.id;
});
let data = await this.where({id: ['IN', ids]}).select();
return data;
}
}
return
{string}获取表名前缀。
return
{String}获取配置对应的 key,缓存 db 句柄时使用。
return
{Object}根据当前的配置获取 db 实例,如果已经存在则直接返回。
return
{String} 模型名称如果已经配置则直接返回,否则解析当前的文件名。
return
{String} 获取表名,包含表前缀获取表名,包含表前缀。
key
{String} 缓存 keytimeout
{Number} 缓存有效时间,单位为秒return
{this}设置缓存选项。
export default class extends think.model.base {
getList(){
return this.cache('getList', 1000).where({id: {'>': 100}}).select();
}
}
export default class extends think.model.base {
getList(){
return this.cache(1000).where({id: {'>': 100}}).select();
}
}
export default class extends think.model.base {
getList(){
return this.cache({
key: 'getList',
timeout: 1000,
type: 'file' //使用文件方式缓存
}).where({id: {'>': 100}}).select();
}
}
offset
{Number} 设置查询的起始位置 length
{Number} 设置查询的数据长度return
{this}设置查询结果的限制条件。
export default class extends think.model.base {
getList(){
//查询20条数据
return this.limit(20).where({id: {'>': 100}}).select();
}
}
export default class extends think.model.base {
getList(){
//从起始位置100开始查询20调数据
return this.limit(100, 20).where({id: {'>': 100}}).select();
}
}
page
{Number} 当前页,从 1 开始listRows
{Number} 每页的条数return
{this}设置查询分页数据,自动转化为 limit
数据。
export default class extends think.model.base {
getList(){
//查询第 2 页数据,每页 10 条数据
return this.page(2, 10).where({id: {'>': 100}}).select();
}
}
where
{String | Object} where 条件return
{this}设置 where 查询条件。可以通过属性 _logic
设置逻辑,默认为 AND
。可以通过属性 _complex
设置复合查询。
注
:1、以下示例不适合 mongo model,mongo 中设置 where 条件请见 model.mongo 里的 where 条件设定。2、where 条件中的值需要在 Logic 里做数据校验,否则可能会有漏洞。
export default class extends think.model.base {
where1(){
//SELECT * FROM `think_user`
return this.where().select();
}
where2(){
//SELECT * FROM `think_user` WHERE ( `id` = 10 )
return this.where({id: 10}).select();
}
where3(){
//SELECT * FROM `think_user` WHERE ( id = 10 OR id < 2 )
return this.where('id = 10 OR id < 2').select();
}
where4(){
//SELECT * FROM `think_user` WHERE ( `id` != 10 )
return this.where({id: ['!=', 10]}).select();
}
}
export default class extends think.model.base {
where1(){
//SELECT * FROM `think_user` where ( title IS NULL );
return this.where({title: null}).select();
}
where2(){
//SELECT * FROM `think_user` where ( title IS NOT NULL );
return this.where({title: ['!=', null]}).select();
}
}
ThinkJS 默认会对字段和值进行转义,防止安全漏洞。有时候一些特殊的情况不希望被转义,可以使用 EXP 的方式,如:
export default class extends think.model.base {
where1(){
//SELECT * FROM `think_user` WHERE ( (`name` ='name') )
return this.where({name: ['EXP', "=\"name\""]}).select();
}
}
export default class extends think.model.base {
where1(){
//SELECT * FROM `think_user` WHERE ( `title` NOT LIKE 'welefen' )
return this.where({title: ['NOTLIKE', 'welefen']}).select();
}
where2(){
//SELECT * FROM `think_user` WHERE ( `title` LIKE '%welefen%' )
return this.where({title: ['like', '%welefen%']}).select();
}
//like 多个值
where3(){
//SELECT * FROM `think_user` WHERE ( (`title` LIKE 'welefen' OR `title` LIKE 'suredy') )
return this.where({title: ['like', ['welefen', 'suredy']]}).select();
}
//多个字段或的关系 like 一个值
where4(){
//SELECT * FROM `think_user` WHERE ( (`title` LIKE '%welefen%') OR (`content` LIKE '%welefen%') )
return this.where({'title|content': ['like', '%welefen%']}).select();
}
//多个字段与的关系 Like 一个值
where5(){
//SELECT * FROM `think_user` WHERE ( (`title` LIKE '%welefen%') AND (`content` LIKE '%welefen%') )
return this.where({'title&content': ['like', '%welefen%']}).select();
}
}
export default class extens think.model.base {
where1(){
//SELECT * FROM `think_user` WHERE ( `id` IN ('10','20') )
return this.where({id: ['IN', '10,20']}).select();
}
where2(){
//SELECT * FROM `think_user` WHERE ( `id` IN (10,20) )
return this.where({id: ['IN', [10, 20]]}).select();
}
where3(){
//SELECT * FROM `think_user` WHERE ( `id` NOT IN (10,20) )
return this.where({id: ['NOTIN', [10, 20]]}).select();
}
}
export default class extens think.model.base {
where1(){
//SELECT * FROM `think_user` WHERE ( (`id` BETWEEN 1 AND 2) )
return this.where({id: ['BETWEEN', 1, 2]}).select();
}
where2(){
//SELECT * FROM `think_user` WHERE ( (`id` BETWEEN '1' AND '2') )
return this.where({id: ['between', '1,2']}).select();
}
}
export default class extends think.model.base {
where1(){
//SELECT * FROM `think_user` WHERE ( `id` = 10 ) AND ( `title` = 'www' )
return this.where({id: 10, title: "www"}).select();
}
//修改逻辑为 OR
where2(){
//SELECT * FROM `think_user` WHERE ( `id` = 10 ) OR ( `title` = 'www' )
return this.where({id: 10, title: "www", _logic: 'OR'}).select();
}
//修改逻辑为 XOR
where2(){
//SELECT * FROM `think_user` WHERE ( `id` = 10 ) XOR ( `title` = 'www' )
return this.where({id: 10, title: "www", _logic: 'XOR'}).select();
}
}
export default class extends think.model.base {
where1(){
//SELECT * FROM `think_user` WHERE ( `id` > 10 AND `id` < 20 )
return this.where({id: {'>': 10, '<': 20}}).select();
}
//修改逻辑为 OR
where2(){
//SELECT * FROM `think_user` WHERE ( `id` < 10 OR `id` > 20 )
return this.where({id: {'<': 10, '>': 20, _logic: 'OR'}}).select()
}
}
export default class extends think.model.base {
where1(){
//SELECT * FROM `think_user` WHERE ( `title` = 'test' ) AND ( ( `id` IN (1,2,3) ) OR ( `content` = 'www' ) )
return this.where({
title: 'test',
_complex: {id: ['IN', [1, 2, 3]],
content: 'www',
_logic: 'or'
}
}).select()
}
}
field
{String | Array} 设置要查询的字段,可以是字符串,也可以是数组return
{this}设置要查询的字段。
export default class extends think.controller.base {
async indexAction(){
let model = this.model('user');
//设置要查询的字符串,字符串方式,多个用逗号隔开
let data = await model.field('name,title').select();
}
}
export default class extends think.controller.base {
//字段里调用 SQL 函数
async listAction(){
let model = this.model('user');
let data = await model.field('id, INSTR(\'30,35,31,\',id + \',\') as d').select();
}
}
export default class extends think.controller.base {
async indexAction(){
let model = this.model('user');
//设置要查询的字符串,数组方式
let data = await model.field(['name','title']).select();
}
}
field
{String | Array} 反选字段,即查询的时候不包含这些字段return
{this}设置反选字段,查询的时候会过滤这些字段,支持字符串和数组 2 种方式。
table
{String} 表名hasPrefix
{Boolean} 是否已经有了表前缀,如果 table 值含有空格,则不在添加表前缀return
{this}设置表名,可以将一个 SQL 语句设置为表名。
export default class extends think.model.base {
getList(){
return this.table('test', true).select();
}
}
export default class extends think.model.base {
async getList(){
let sql = await this.model('group').group('name').buildSql();
let data = await this.table(sql).select();
return data;
}
}
union
{String | Object} 联合查询 SQL 或者表名all
{Boolean} 是否是 UNION ALL 方式return
{this}联合查询。
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` UNION (SELECT * FROM think_pic2)
return this.union('SELECT * FROM think_pic2').select();
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` UNION ALL (SELECT * FROM `think_pic2`)
return this.union({table: 'think_pic2'}, true).select();
}
}
join
{String | Object | Array} 要组合的查询语句,默认为 LEFT JOIN
return
{this}组合查询,支持字符串、数组和对象等多种方式。
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` LEFT JOIN think_cate ON think_group.cate_id=think_cate.id
return this.join('think_cate ON think_group.cate_id=think_cate.id').select();
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` LEFT JOIN think_cate ON think_group.cate_id=think_cate.id RIGHT JOIN think_tag ON think_group.tag_id=think_tag.id
return this.join([
'think_cate ON think_group.cate_id=think_cate.id',
'RIGHT JOIN think_tag ON think_group.tag_id=think_tag.id'
]).select();
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` INNER JOIN `think_cate` AS c ON think_user.`cate_id`=c.`id`
return this.join({
table: 'cate',
join: 'inner', //join 方式,有 left, right, inner 3 种方式
as: 'c', // 表别名
on: ['cate_id', 'id'] //ON 条件
}).select();
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM think_user AS a LEFT JOIN `think_cate` AS c ON a.`cate_id`=c.`id` LEFT JOIN `think_group_tag` AS d ON a.`id`=d.`group_id`
return this.alias('a').join({
table: 'cate',
join: 'left',
as: 'c',
on: ['cate_id', 'id']
}).join({
table: 'group_tag',
join: 'left',
as: 'd',
on: ['id', 'group_id']
}).select()
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` LEFT JOIN `think_cate` ON think_user.`id`=think_cate.`id` LEFT JOIN `think_group_tag` ON think_user.`id`=think_group_tag.`group_id`
return this.join({
cate: {
on: ['id', 'id']
},
group_tag: {
on: ['id', 'group_id']
}
}).select();
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM think_user AS a LEFT JOIN `think_cate` AS c ON a.`id`=c.`id` LEFT JOIN `think_group_tag` AS d ON a.`id`=d.`group_id`
return this.alias('a').join({
cate: {
join: 'left', // 有 left,right,inner 3 个值
as: 'c',
on: ['id', 'id']
},
group_tag: {
join: 'left',
as: 'd',
on: ['id', 'group_id']
}
}).select()
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` LEFT JOIN `think_cate` ON think_user.`id`=think_cate.`id` LEFT JOIN `think_group_tag` ON think_user.`id`=think_group_tag.`group_id` LEFT JOIN `think_tag` ON (think_user.`id`=think_tag.`id` AND think_user.`title`=think_tag.`name`)
return this.join({
cate: {on: 'id, id'},
group_tag: {on: ['id', 'group_id']},
tag: {
on: { // 多个字段的 ON
id: 'id',
title: 'name'
}
}
}).select()
}
}
export default class extends think.model.base {
async getList(){
let sql = await this.model('group').buildSql();
//SELECT * FROM `think_user` LEFT JOIN ( SELECT * FROM `think_group` ) ON think_user.`gid`=( SELECT * FROM `think_group` ).`id`
return this.join({
table: sql,
on: ['gid', 'id']
}).select();
}
}
order
{String | Array | Object} 排序方式return
{this}设置排序方式。
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` ORDER BY id DESC, name ASC
return this.order('id DESC, name ASC').select();
}
getList1(){
//SELECT * FROM `think_user` ORDER BY count(num) DESC
return this.order('count(num) DESC').select();
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` ORDER BY id DESC,name ASC
return this.order(['id DESC', 'name ASC']).select();
}
}
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` ORDER BY `id` DESC,`name` ASC
return this.order({
id: 'DESC',
name: 'ASC'
}).select();
}
}
tableAlias
{String} 表别名return
{this}设置表别名。
export default class extends think.model.base {
getList(){
//SELECT * FROM think_user AS a;
return this.alias('a').select();
}
}
having
{String} having 查询的字符串return
{this}设置 having 查询。
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` HAVING view_nums > 1000 AND view_nums < 2000
return this.having('view_nums > 1000 AND view_nums < 2000').select();
}
}
group
{String} 分组查询的字段return
{this}设定分组查询。
export default class extends think.model.base {
getList(){
//SELECT * FROM `think_user` GROUP BY `name`
return this.group('name').select();
}
}
distinct
{String} 去重的字段return
{this}去重查询。
export default class extends think.model.base {
getList(){
//SELECT DISTINCT `name` FROM `think_user`
return this.distinct('name').select();
}
}
explain
{Boolean} 是否添加 explain 执行return
{this}是否在 SQL 之前添加 explain 执行,用来查看 SQL 的性能。
操作选项过滤。
data
{Object | Array} 要操作的数据数据过滤。
data
{Object} 要添加的数据添加前置操作。
data
{Object} 要添加的数据添加后置操作。
删除后置操作。
data
{Object} 要更新的数据更新前置操作。
data
{Object} 要更新的数据更新后置操作。
data
{Object} 查询的单条数据return
{Object | Promise}find
查询后置操作。
data
[Array] 查询的数据数据return
{Array | Promise}select
查询后置操作。
data
{Object}添加和更新操作时设置操作的数据。
options
{Object} 设置操作选项。如:
export default class extends think.model.base {
getList(){
return this.options({
where: 'id = 1',
limit: [10, 1]
}).select();
}
}
关于数据库连接,一般情况下不要直接调用。
table
{String} 表名return
{Promise}获取表的字段信息,自动从数据库中读取。
return
{String}获取最后执行的 SQL 语句。
return
{Promise}将当前的查询条件生成一个 SQL 语句。
oriOpts
{Object}extraOptions
{Object}return
{Promise}根据已经设定的一些条件解析当前的操作选项。
return
{Promise}返回 pk
的值,返回一个 Promise。
field
{String} 数据表中的字段名称value
{Mixed}return
{Mixed}根据数据表中的字段类型解析 value。
data
{Object} 要解析的数据return
{Object}调用 parseType
方法解析数据。
data
{Object} 要添加的数据options
{Object} 操作选项replace
{Boolean} 是否是替换操作return
{Promise} 返回插入的 ID添加一条数据。
data
{Object} 要添加的数据where
{Object} where 条件return
{Promise}当 where 条件未命中到任何数据时才添加数据。
dataList
{Array} 要添加的数据列表options
{Object} 操作选项replace
{Boolean} 是否是替换操作return
{Promise} 返回插入的 ID一次添加多条数据。
options
{Object} 操作选项return
{Promise} 返回影响的行数删除数据。
data
{Object} 要更新的数据options
{Object} 操作选项return
{Promise} 返回影响的行数更新数据。
dataList
{Array} 要更新的数据列表options
{Object} 操作选项return
{Promise}更新多条数据,dataList 里必须包含主键的值,会自动设置为更新条件。
field
{String} 字段名step
{Number} 增加的值,默认为 1return
{Promise}字段值增加。
field
{String} 字段名step
{Number} 增加的值,默认为 1return
{Promise}字段值减少。
options
{Object} 操作选项return
{Promise} 返回单条数据查询单条数据,返回的数据类型为对象。如果未查询到相关数据,返回值为 {}
。
options
{Object} 操作选项return
{Promise} 返回多条数据查询单条数据,返回的数据类型为数组。如果未查询到相关数据,返回值为 []
。
options
{Object} 操作选项pageFlag
{Boolean} 当页数不合法时处理,true 为修正到第一页,false 为修正到最后一页,默认不修正return
{Promise}分页查询,一般需要结合 page
方法一起使用。如:
export default class extends think.controller.base {
async listAction(){
let model = this.model('user');
let data = await model.page(this.get('page')).countSelect();
}
}
返回值数据结构如下:
{
numsPerPage: 10, //每页显示的条数
currentPage: 1, //当前页
count: 100, //总条数
totalPages: 10, //总页数
data: [{ //当前页下的数据列表
name: "thinkjs",
email: "admin@thinkjs.org"
}, ...]
}
field
{String} 字段名,多个字段用逗号隔开one
{Boolean | Number} 获取的条数return
{Promise}获取特定字段的值。
field
{String} 字段名return
{Promise} 返回总条数获取总条数。
field
{String} 字段名return
{Promise}对字段值进行求和。
field
{String} 字段名return
{Promise}求字段的最小值。
field
{String} 字段名return
{Promise}求字段的最大值。
field
{String} 字段名return
{Promise}求字段的平均值。
return
{Promise}指定 SQL 语句执行查询。
return
{Promise}执行 SQL 语句。
sql
{String} 要解析的 SQL 语句return
{String}解析 SQL 语句,调用 util.format
方法解析 SQL 语句,并将 SQL 语句中的 __TABLENAME__
解析为对应的表名。
export default class extends think.model.base {
getSql(){
let sql = 'SELECT * FROM __GROUP__ WHERE id=%d';
sql = this.parseSql(sql, 10);
//sql is SELECT * FROM think_group WHERE id=10
}
}
return
{Promise}开启事务。
return
{Promise}提交事务。
return
{Promise}回滚事务。
fn
{Function} 要执行的函数return
{Promise}使用事务来执行传递的函数,函数要返回 Promise。
export default class extends think.model.base {
updateData(data){
return this.transaction(async () => {
let insertId = await this.add(data);
let result = await this.model('user_cate').add({user_id: insertId, cate_id: 100});
return result;
})
}
}