Model

原型方法

field(field, reverse)

设置要查询的字段。

  • field string | array 要查询的字段,可以是字符串,也可以是数组
  • reverse boolean 是否反选字段
  • return this
  1. // 生成的sql语句为,以下同:
  2. // SELECT * FROM `meinv_group`
  3. D('Group').field().select();
  4. // SELECT `id`,`title` FROM `meinv_group`
  5. D('Group').field('id, title').select();
  6. // SELECT `id`,`title` FROM `meinv_group`
  7. D('Group').field(['id', 'title']).select();
  8. // SELECT `cate_id`,`md5`,`width`,`height`,`pic_nums`,`view_nums`,`date` FROM `meinv_group`
  9. D('Group').field(['id', 'title'], true).select();

limit(offset, length)

设置查询的数量。

  • offset 起始位置
  • length 查询的数目
  • return this
  1. // SELECT * FROM `meinv_group` LIMIT 10
  2. D('Group').limit(10).select();
  3. // SELECT * FROM `meinv_group` LIMIT 10,20
  4. D('Group').limit(10, 20).select();

page(page, listRows)

设置当前查询的页数,页数从1开始

  • page 当前的页数
  • listRows 一页多少条记录,默认值为C('db_nums_per_page')
  • return this
  1. // SELECT * FROM `meinv_group`
  2. D('Group').page().select();
  3. // SELECT * FROM `meinv_group` LIMIT 0,20
  4. D('Group').page(1).select();
  5. // SELECT * FROM `meinv_group` LIMIT 10,10
  6. D('Group').page(2, 10).select();

union(union, all)

联合查询

  • union 联合查询的字符串
  • all 是否为UNION ALL模式
  • return this
  1. // SELECT * FROM `meinv_pic1` UNION (SELECT * FROM meinv_pic2)
  2. D('Pic1').union('SELECT * FROM meinv_pic2').select();
  3. // SELECT * FROM `meinv_pic1` UNION ALL (SELECT * FROM meinv_pic2)
  4. D('Pic1').union('SELECT * FROM meinv_pic2', true).select();
  5. // SELECT * FROM `meinv_pic1` UNION ALL (SELECT * FROM `meinv_pic2`)
  6. D('Pic1').union({table: 'meinv_pic2'}, true).select();
  7. // SELECT * FROM `meinv_pic1` UNION ALL (SELECT * FROM `meinv_pic2`) UNION (SELECT * FROM meinv_pic3)
  8. D('Pic1').union({table: 'meinv_pic2'}, true).union({table: 'meinv_pic3'}).select();

join(join)

组合查询

  • join 可以是字符串、数组、对象
  • return this
  1. // SELECT * FROM `meinv_group` LEFT JOIN meinv_cate ON meinv_group.cate_id=meinv_cate.id
  2. D('Group').join('meinv_cate ON meinv_group.cate_id=meinv_cate.id').select();
  3. // SELECT * FROM `meinv_group` LEFT JOIN meinv_cate ON meinv_group.cate_id=meinv_cate.id RIGHT JION meinv_tag ON meinv_group.tag_id=meinv_tag.id
  4. D('Group').join(['meinv_cate ON meinv_group.cate_id=meinv_cate.id', 'RIGHT JOIN meinv_tag ON meinv_group.tag_id=meinv_tag.id']).select();
  5. // SELECT * FROM meinv_group INNER JOIN `meinv_cate` AS c ON meinv_group.`cate_id`=c.`id`
  6. D('Group').join({
  7. table: 'cate',
  8. join: 'inner', //join方式,有 left, right, inner 3种方式
  9. as: 'c', //表别名
  10. on: ['cate_id', 'id'] //ON条件
  11. }).select();
  12. // SELECT * FROM meinv_group AS a LEFT JOIN `meinv_cate` AS c ON a.`cate_id`=c.`id` LEFT JOIN `meinv_group_tag` AS d ON a.`id`=d.`group_id`
  13. D('Group').alias('a').join({
  14. table: 'cate',
  15. join: 'left',
  16. as: 'c',
  17. on: ['cate_id', 'id']
  18. }).join({
  19. table: 'group_tag',
  20. join: 'left',
  21. as: 'd',
  22. on: ['id', 'group_id']
  23. }).select()
  24. // SELECT * FROM meinv_group AS a LEFT JOIN `meinv_cate` AS c ON a.`id`=c.`id` LEFT JOIN `meinv_group_tag` AS d ON a.`id`=d.`group_id`
  25. D('Group').alias('a').join({
  26. cate: {
  27. join: 'left', //有left,right,inner 3个值
  28. as: 'c',
  29. on: ['id', 'id']
  30. },
  31. group_tag: {
  32. join: 'left',
  33. as: 'd',
  34. on: ['id', 'group_id']
  35. }
  36. }).select()
  37. //SELECT * FROM `meinv_group` LEFT JOIN `meinv_cate` ON meinv_group.`id`=meinv_cate.`id` LEFT JOIN `meinv_group_tag` ON meinv_group.`id`=meinv_group_tag.`group_id`
  38. D('Group')join({
  39. cate: {
  40. on: ['id', 'id']
  41. },
  42. group_tag: {
  43. on: ['id', 'group_id']
  44. }
  45. }).select()
  46. //SELECT * FROM `meinv_group` LEFT JOIN `meinv_cate` ON meinv_group.`id`=meinv_cate.`id` LEFT JOIN `meinv_group_tag` ON meinv_group.`id`=meinv_group_tag.`group_id` LEFT JOIN `meinv_tag` ON (meinv_group.`id`=meinv_tag.`id` AND meinv_group.`title`=meinv_tag.`name`)
  47. D('Group').join({
  48. cate: {
  49. on: 'id, id'
  50. },
  51. group_tag: {
  52. on: ['id', 'group_id']
  53. },
  54. tag: {
  55. on: { // 多个字段的ON
  56. id: 'id',
  57. title: 'name'
  58. }
  59. }
  60. }).select()

order(order)

设置排序方式

  • order 排序方式,字符串
  • return this
  1. // SELECT * FROM `meinv_group` ORDER BY id
  2. D('Group').order('id').select();
  3. // SELECT * FROM `meinv_group` ORDER BY id DESC
  4. D('Group').order('id DESC').select();
  5. // SELECT * FROM `meinv_group` ORDER BY id DESC,title ASC
  6. D('Group').order('id DESC,title ASC').select();
  7. // SELECT * FROM `meinv_group` ORDER BY id ASC
  8. D('Group').order(['id ASC']).select();
  9. // SELECT * FROM `meinv_group` ORDER BY id ASC,title DESC
  10. D('Group').order(['id ASC', 'title DESC']).select()
  11. // SELECT * FROM `meinv_group` ORDER BY `id` ASC,`title` DESC
  12. D('Group').order({id: 'ASC', title: 'DESC'}).select()

alias(alias)

设置表别名

  • alaias 表别名,字符串
  • return this
  1. //SELECT * FROM meinv_group AS a
  2. D('Group').alias('a').select();

having(str)

having查询

  • str having查询的字符串
  • return this
  1. // SELECT * FROM `meinv_group` HAVING view_nums > 1000 AND view_nums < 2000
  2. D('Group').having('view_nums > 1000 AND view_nums < 2000').select();

group(field)

分组查询

  • field 设定分组查询的字段
  • return this
  1. // SELECT * FROM `meinv_group` GROUP BY `view_nums`
  2. D('Group').group('view_nums').select();

distinct(field)

去重查询

  • field 去重的字段
  • return this
  1. // SELECT Distinct `view_nums` FROM `meinv_group`
  2. D('Group').distinct('view_nums').select();

where(where)

设置where条件

  • where 查询条件,可以是字符串、对象
  • return this

普通条件

  1. // SELECT * FROM `meinv_group`
  2. D('Group').where().select();
  3. // SELECT * FROM `meinv_group` WHERE ( `id` = 10 )
  4. D('Group').where({id: 10}).select();
  5. //查询字符串
  6. // SELECT * FROM `meinv_group` WHERE id = 10 OR id < 2
  7. D('GROUP').where('id = 10 OR id < 2').select();
  8. //操作符
  9. // SELECT * FROM `meinv_group` WHERE ( `id` != 10 )
  10. D('Group').where({id: ['!=', 10]}).select(); //这里的操作符有 > >= < <= !=

EXP条件

thinkjs默认会对字段和值进行转义,防止安全漏洞。有时候一些特殊的情况不希望被转义,可以使用EXP的方式

  1. //SELECT * FROM `meinv_group` WHERE name='name'
  2. D('GROUP').where({name: ['EXP', "='name'"]});
  1. //将view_nums字段值加1
  2. D('GROUP').update({view_nums: ['EXP', 'view_nums+1']});

LIKE条件

  1. // LIKE和NOT LIKE
  2. // SELECT * FROM `meinv_group` WHERE ( `title` NOT LIKE 'welefen' )
  3. D('Group').where({title: ['NOTLIKE', 'welefen']}).select();
  4. // SELECT * FROM `meinv_group` WHERE ( `title` LIKE '%welefen%' )
  5. D('Group').where({title: ['like', '%welefen%']}).select();
  6. //LIKE多个值
  7. // SELECT * FROM `meinv_group` WHERE ( (`title` LIKE 'welefen' OR `title` LIKE 'suredy') )
  8. D('Group').where({title: ['like', ['welefen', 'suredy']]}).select()
  9. //多个字段LIKE同一个值,或的关系
  10. //SELECT * FROM `meinv_group` WHERE ( (`title` LIKE '%welefen%') OR (`content` LIKE '%welefen%') )
  11. D('Group').where({'title|content': ['like', '%welefen%']}).select();
  12. //多个字段LIKE同一个只,与的关系
  13. //SELECT * FROM `meinv_group` WHERE ( (`title` LIKE '%welefen%') AND (`content` LIKE '%welefen%') )
  14. D('Group').where({'title&content': ['like', '%welefen%']}).select();

IN条件

  1. //SELECT * FROM `meinv_group` WHERE ( `id` IN ('10','20') )
  2. D('Group').where({id: ['IN', '10,20']}).select();
  3. //SELECT * FROM `meinv_group` WHERE ( `id` IN (10,20) )
  4. D('Group').where({id: ['IN', [10, 20]]}).select();
  5. //SELECT * FROM `meinv_group` WHERE ( `id` NOT IN (10,20) )
  6. D('Group').where({id: ['NOTIN', [10, 20]]}).select()

多字段查询

  1. //SELECT * FROM `meinv_group` WHERE ( `id` = 10 ) AND ( `title` = 'www' )
  2. D('Group').where({id: 10, title: "www"}).select();
  3. //修改为或的关系
  4. //SELECT * FROM `meinv_group` WHERE ( `id` = 10 ) OR ( `title` = 'www' )
  5. D('Group').where({id: 10, title: "www", _logic: 'OR'}).select();
  6. //修改为异或的关系
  7. //SELECT * FROM `meinv_group` WHERE ( `id` = 10 ) XOR ( `title` = 'www' )
  8. D('Group').where({id: 10, title: "www", _logic: 'XOR'})

BETWEEN查询

  1. //SELECT * FROM `meinv_group` WHERE ( (`id` BETWEEN 1 AND 2) )
  2. D('Group').where({id: ['BETWEEN', 1, 2]}).select();
  3. //SELECT * FROM `meinv_group` WHERE ( (`id` BETWEEN '1' AND '2') )
  4. D('Group').where({id: ['between', '1,2']}).select()

复合查询

  1. // SELECT * FROM `meinv_group` WHERE ( `id` > 10 AND `id` < 20 )
  2. D('Group').where({id: {
  3. '>': 10,
  4. '<': 20
  5. }}).select()
  6. // SELECT * FROM `meinv_group` WHERE ( `id` < 10 OR `id` > 20 )
  7. D('Group').where({id: {
  8. '<': 10,
  9. '>': 20,
  10. _logic: 'OR'
  11. }}).select()
  12. //SELECT * FROM `meinv_group` WHERE ( `id` >= 10 AND `id` <= 20 ) OR ( `title` LIKE '%welefen%' ) OR ( `date` > '2014-08-12' )
  13. D('Group')..where({id: {
  14. '>=': 10,
  15. '<=': 20
  16. }, 'title': ['like', '%welefen%'], date: ['>', '2014-08-12'], _logic: 'OR'}).select()

count(field)

查询符合条件的数目,可以有where条件

  • field count的字段,默认会从数据表里查找主键的字段
  • return promise
  1. //SELECT COUNT(id) AS thinkjs_count FROM `meinv_group` LIMIT 1
  2. D('Group').count('id').then(function(count){
  3. //count为符合条件的数目
  4. });

sum(field)

对符合条件的字段值求和,可以有where条件

  • field 求和的字段
  • return promise
  1. //SELECT SUM(view_nums) AS thinkjs_sum FROM `meinv_group` LIMIT 1
  2. D('Group').sum('view_nums').then(function(sum){
  3. //sum为求和的值
  4. })

min(field)

求字段的最小值

  • field 要求最小值的字段
  • return promise
  1. //SELECT MIN(view_nums) AS thinkjs_min FROM `meinv_group` LIMIT 1
  2. D('Group').min('view_nums').then(function(min){
  3. //min为最小的view_nums值
  4. })

max(field)

求字段的最大值

  • field 要求最大值的字段
  • return promise
  1. //SELECT MAX(view_nums) AS thinkjs_max FROM `meinv_group` LIMIT 1
  2. D('Group').max('view_nums').then(function(max){
  3. //max为最小的view_nums值
  4. })

avg(field)

求字段的平均值

  • field 要求平均值的字段
  • return promise
  1. //SELECT AVG(view_nums) AS thinkjs_avg FROM `meinv_group` LIMIT 1
  2. D('Group').avg('view_nums').then(function(avg){
  3. })

add(data)

插入数据

  • data 要插入的数据,对象
  • return promise
  1. var data = {
  2. title: 'xxx',
  3. content: 'yyy'
  4. };
  5. D('Group').add(data).then(function(insertId){
  6. //如果插入成功,insertId为插入的id
  7. }).catch(function(err){
  8. //插入失败,err为具体的错误信息
  9. })

如果数据表中有字段设置为unique,插入一个已经存在的值时就会报错。这种情况一般需要先按这个字段去查询下看有没有对应的记录,如果没有在进行插入。

为了简化开发者的使用,thinkjs提供了thenAdd方法。

thenAdd(data, where, returnDetail)

当数据表中不存在where条件对应的数据时,才进行插入。

  • data 要插入的数据
  • where 检测的条件
  • returnDetail 是否返回详细的信息
  1. //假设数据表中字段title类型为UNIQUE
  2. var data = {
  3. title: 'xxx',
  4. content: 'yyy'
  5. };
  6. var where = {
  7. title: 'xxx'
  8. }
  9. D('Group').thenAdd(data, where).then(function(id){
  10. //id为已经存在的id或者刚插入的id
  11. })
  12. //返回详细的信息
  13. D('Group').thenAdd(data, where, true).then(function(data){
  14. //data数据结构为
  15. data = {
  16. type: 'exist' || 'add', //exist表示之前已经存在,add表示新添加
  17. id: 111
  18. }
  19. })

使用场景:用户注册时就可以通过该方法来检查用户名或者邮箱已经存在。

addAll(data)

一次添加多条数据

  • data 要添加的数据,数组
  • return promise
  1. var data = [{title: 'xxx'}, {title: 'yyy'}];
  2. D('Group').addAll(data).then(function(insertId){
  3. //插入成功
  4. }).catch(function(err){
  5. //插入失败
  6. })

delete()

  • return promise

删除符合条件的数据

  1. //删除所有数据
  2. D('Group').delete().then(function(affectedRows){
  3. //affectedRows为影响的行数
  4. })
  5. //删除id小于100的数据
  6. D('Group').where({id: ['<', 100]}).delete().then(function(affectedRows){
  7. //affectedRows为影响的行数
  8. })

update(data)

更新符合条件的数据

  • data 要更新的数据
  • return promise
  1. //将id<10的title设置为空
  2. D('Group').where({id: ['<', 10]}).update({
  3. title: ''
  4. })

select()

查询符合条件的数据

  • return promise
  1. D('Group').where({id: ['IN', [1, 2, 3]]}).select().then(function(data){
  2. //data为数组
  3. //如果查询数据为空,那么data为 []
  4. data = [{
  5. id: 1,
  6. title: '',
  7. ...
  8. },{
  9. id: 2,
  10. title: ''
  11. ...
  12. }
  13. ]
  14. })

find()

查找某一条符合条件的数据。

  • return promise
  1. //查询id=1000的一条数据
  2. D('Group').where({id: 1000}).find().then(function(data){
  3. //data为一个数据对象
  4. //如果数据为空,那么data为 {}
  5. data = {
  6. id: 1000,
  7. title: 'xxx',
  8. ...
  9. }
  10. })

updateInc(field, step)

将字段值增加

  • field 要增加的字段
  • step 增加的数值,默认为1
  • return promise
  1. //将id=10的浏览数加1
  2. D('Group').where({id: 10}).updateInc('view_nums').then(function(){
  3. })
  4. //将id=100的浏览数加10
  5. D('Group').where({id: 100}).updateInc('view_nums', 10).then(function(){
  6. })

updateDec(field, step)

将字段值减少

  • field 要减少的字段
  • step 减少的值,默认为1
  • return promise
  1. //将id=10的浏览数减1
  2. D('Group').where({id: 10}).updateDec('view_nums').then(function(){
  3. })
  4. //将id=100的浏览数减10
  5. D('Group').where({id: 100}).updateDec('view_nums', 10).then(function(){
  6. })

getField(field, onlyOne)

获取某个字段的值。

  • field 要获取的字段,可以是一个字段,也可以是多个字段,多个字段用,隔开
  • onlyOne 是否只需要一个值, true 或者数字
  • return promise
  1. //取id>5000的集合,只需要id值,不需要其他字段值
  2. D('Group').where({id: ['>',5000]}).getField('id').then(function(data){
  3. //data为一个数组
  4. data = [7565,7564,7563,7562,7561,7560,7559,7558,7557]
  5. })
  6. //只需要id>5000的一个值
  7. D('Group').where({id: ['>', 5000]}).getField('id', true).then(function(data){
  8. //data为数字
  9. data = 7557;
  10. })
  11. //只需要id>5000的3值
  12. D('Group').where({id: ['>', 5000]}).getField('id', 3).then(function(data){
  13. //data为数字
  14. data = [7559, 7558, 7557];
  15. })
  16. //获取id和view_nums 2个字段的值
  17. D('Group').getField('id,view_nums').then(function(data){
  18. data = {
  19. "id":[7565,7564,7563,7562,7561,7560,7559,7558,7557],
  20. "view_nums":[1965,1558,2335,2013,1425,1433,1994,2035,1118]
  21. }
  22. })

countSelect(options, flag)

  • options 查询参数
  • flag 当分页值不合法的时候,处理情况。true为修正到第一页,false为修正到最后一页,默认不进行修正。
  • return promise
  1. //按每页20条数据来展现文件
  2. D('Article').page(this.get("page"), 20).countSelect().then(function(data){
  3. //data的数据格式为
  4. {
  5. count: 123, //总条数
  6. total: 10, //总页数
  7. page: 1, //当前页
  8. num: 20, //每页显示多少条
  9. data: [{}, {}] //详细的数据
  10. }
  11. });

buildSql(options)

将当前查询条件生成一个SELECT语句,可以用作子查询的sql语句。

  • options 操作选项
  • return promise
  1. D('Cate').where({id: ['>', 10]}).buildSql().then(function(sql){
  2. //sql = SELECT `id` FROM `meinv_cate` WHERE id > 10
  3. return D('GROUP').where({cate_id: ['IN', sql, 'exp']});
  4. })

query(sql, parse)

自定义sql语句进行查询,用于非常复杂的sql语句时使用。

  • sql 要执行的sql语句
  • parse 格式参数的数据
  • return promise
  1. var data = [
  2. value.field || '*',
  3. mapOptions.mapfKey,
  4. value.rTable || self.getRelationTableName(mapOptions.model),
  5. mapOptions.model.getTableName(),
  6. whereStr || 'WHERE ',
  7. value.rfKey || (mapOptions.model.getModelName().toLowerCase() + '_id'),
  8. mapOptions.model.getPk(),
  9. value.where ? (' AND ' + value.where) : ''
  10. ]
  11. D('Group').query('SELECT b.%s, a.%s FROM %s as a, %s as b %s AND a.%s=b.%s %s', data).then(function(data){
  12. //查询的数据
  13. })

sql语句中支持如下字符串的自动替换:

  • __TABLE__ 替换为当前模型里的表名
  • __USER__ 替换为 C('db_prefix') + 'user' 表,其他表类似
  1. //解析后的sql为 SELECT * FROM meinv_group as a LEFT JOIN meinv_user as u ON a.id=u.id WHERE u.id > 10
  2. D('Group').query('SELECT * FROM __TABLE__ as a LEFT JOIN __USER__ as u ON a.id=u.id WHERE u.id > %d', 10);

execute(sql, parse)

自定义sql语句执行,用户复杂sql语句的情况。

使用方式与query相同,只是then里拿到的结果不同。exectue为影响的行数。

close()

关闭当前数据库连接,非特殊条件下不要使用该方法。

静态方法

close()

关闭所有数据库连接。

  1. thinkRequire('Model').close();

数据库默认使用长连接的方式,不建议关闭数据库连接。该接口非特殊条件下,不要使用。