博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
thinkjs——一个字段一种数字代表两种状态
阅读量:6599 次
发布时间:2019-06-24

本文共 3093 字,大约阅读时间需要 10 分钟。

问题来源:

现有一张company数据表,其中有一个字段state(-2:待审核;-1:禁用;0:正常;1:会员过期;),一般而言,在前期设计数据表的时候,会将每种状态下都用一种特定的数字代表,但是这里起初并没有将-2代表的待审核和拒绝状态分开,即-2代表着两种状态:待审核以及拒绝。现要求在字段state不增加值的情况下,根据company中的另外一个字段refuse是否为空来区分是待审核或者是拒绝。

分析:

拿到需求,先分析一下:在原来-2的基础之上,在查询条件中增加refuse条件即可。

解决过程:

'use strict';/** * author: xxx * create: xxx * update: xxx * desc: 公司管理model */export default class extends think.model.base {    getList(obj){        let whereObj={};        if(obj.id){            whereObj['id']=obj.id        }        if(obj.state && obj.state!=2){  //2为全部            if(obj.state == -51){
// 假定待审核状态为-51 let sql = " ' ' or refuse is null "; whereObj.refuse = sql; whereObj.state = -2; } else if(obj.state == -50){
//假定拒绝状态为-50 let sql =“!=‘’”; whereObj.refuse = sql; whereObj.state = -2; }else{ whereObj.state = obj.state; } } console.log(whereObj); if(obj.type && obj.type!=-100){ whereObj.type=obj.type } if(obj.name){ whereObj['name']=["like", "%"+obj.name+"%"] } if(obj.people){ whereObj['people']=["like", "%"+obj.people+"%"] } if(obj.stime&&!isNaN(obj.stime)&&obj.etime&&!isNaN(obj.etime)){ {whereObj['regtime']={'>':obj.stime,'<':Number.parseInt(obj.etime)+24*60*60}} }else if(!isNaN(obj.stime)&&obj.stime){ whereObj['regtime']={'>':obj.stime}; }else if(!isNaN(obj.etime)&&obj.etime){ whereObj['regtime']={'<':Number.parseInt(obj.etime)+24*60*60}; } return this.page(obj.page, obj.rows).order('id DESC').where(whereObj).countSelect(); }}

原以为这样子处理就万事大吉了,只是在程序执行的过程中,出现了异常:thinkjs在自己特有的运行机制中,将这句sql语句转为了:

//执行结果[2017-02-22 16:12:09] [SQL] SELECT COUNT(company.id) AS think_count FROM `company` WHERE ( `refuse` = ' \' \' or refuse is null ' ) AND ( `state` = -2 ) ORDER BY id DESC LIMIT 1 3ms

这样也就导致最终查询出来的数据出了问题。究其原因,是因为将where条件中的语句进行了转义,而我们并不需要转义过来的sql语句,那怎么能使这句sql在执行过程中不进行转义呢?在thinkjs官网中又找到了这样一条信息:

//thinkjs 官网EXP 条件ThinkJS 默认会对字段和值进行转义,防止安全漏洞。有时候一些特殊的情况不希望被转义,可以使用 EXP 的方式,如:export default class extends think.model.base {  where1(){    //SELECT * FROM `think_user` WHERE ( (`name` ='name') )    return this.where({name: ['EXP', "=\"name\""]}).select();  }}

原来超强的thinkjs中竟然有防止转义的方法,那一刻真的有点小兴奋:这就是问题马上解决出来的快感(嘿嘿……)

于是乎,之前的代码就成功转型为:

if(obj.state && obj.state!=2){            if(obj.state == -51){
//待审核 let sql = ['EXP', "= \' \' or refuse is null "]; whereObj.refuse = sql; whereObj.state = -2; } else if(obj.state == -50){
//拒绝 let sql = ['EXP', "!='' "]; whereObj.refuse = sql; whereObj.state = -2; }else{ whereObj.state = obj.state; } }

执行后的sql语句为:

//执行结果[2017-02-22 17:30:58] [SQL] SELECT COUNT(company.id) AS think_count FROM `company` WHERE ( (`refuse` !='' ) ) AND ( `state` = -2 ) ORDER BY id DESC LIMIT 1 2ms

这样便完美的解决了这个问题。

转载地址:http://zplio.baihongyu.com/

你可能感兴趣的文章
C#编程(四十七)----------集合接口和类型
查看>>
洛谷P1294 高手去散步 搜索
查看>>
java的Date() 转换符
查看>>
手机浏览器旋转为宽屏模式下文字会自动放大的解决方案
查看>>
【模板】二分图匹配
查看>>
php调试工具 xdebug的安装 和phpstorm的配置
查看>>
【转】关于大型网站技术演进的思考(十二)--网站静态化处理—缓存(4)
查看>>
WCF、WebAPI、WCFREST、WebService之间的区别
查看>>
20155203 实验五《网络编程与安全》
查看>>
网络对抗技术作业一
查看>>
积跬步,聚小流------Bootstrap学习记录(1)
查看>>
HDUPhysical Examination(贪心)
查看>>
xtrabackup备份还原
查看>>
《编译器设计》读书笔记——中间表示
查看>>
HTML5 FileAPI
查看>>
使用tdcss.js轻松制作自己的style guide
查看>>
iOS比较常用的第三方及实例(不断更新中)
查看>>
jffs2系统制作2
查看>>
android 32 Gallery:横着滚动的列表
查看>>
八、mini2440裸机程序之UART(2)UART0与PC串口通信【转】
查看>>