首页 > 代码库 > thinkjs——一个字段一种数字代表两种状态

thinkjs——一个字段一种数字代表两种状态

问题来源:

现有一张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官网中又找到了这样一条信息:

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

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

thinkjs——一个字段一种数字代表两种状态