问题来源:

现有一张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——一个字段一种数字代表两种状态的更多相关文章

  1. 判断一个字符是否为数字的两种方法(C/C++)

    在平时,我们经常遇见判断字符是否为数字这种题目,虽然感觉还是很简单,不过我是个更喜欢用函数的人,因为我觉得这样更便捷,所以我更推荐第二种方式. 1.直接判断 #include <stdio.h& ...

  2. Java判断一个字符是否是数字的几种方法的代码

    在工作期间,将写内容过程经常用到的一些内容段做个记录,下面内容是关于Java判断一个字符是否是数字的几种方法的内容,希望能对码农们有好处. public class Test{ public stat ...

  3. 在论坛中出现的比较难的sql问题:16(取一个字段中的数字)

    原文:在论坛中出现的比较难的sql问题:16(取一个字段中的数字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 问题:取一个字段中的数字http://bbs.csdn ...

  4. Oracle sql判断一个字段是否全数字 或含有中文

    update (select length(t.name), t.* -- name,length(name) from g_enterprise_info t where nvl2(translat ...

  5. 20Mybatis_订单商品数据模型_一对一查询——resultType和resultMap两种方式以及两种方式的总结

    上一篇文章分析了数据模型,这篇文章就给出一个需求,这个需求是一对一查询,并完成这个需求. ------------------------------------------------------- ...

  6. 蓝桥杯 - 数字排列(今有7对数字) - [两种不同的DFS思路]

    今有7对数字:两个1,两个2,两个3,...两个7,把它们排成一行.要求,两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字.如下就是一个符合要求的排列: 171264 ...

  7. linux中添加一个用户到指定用户组的两种方式,修改一个用户到指定用户组的一种方式

    添加一个用户到指定用户组: gpasswd –a 用户名 组名usermod –G 组名 用户名 //第一种:gpasswd –a 用户名 组名 [root@localhost ~]# id user ...

  8. javade多任务处理之Executors框架(线程池)实现的内置几种方式与两种基本自定义方式

    一 Executors框架(线程池) 主要是解决开发人员进行线程的有效控制,原理可以看jdk源码,主要是由java.uitl.concurrent.ThreadPoolExecutor类实现的,这里只 ...

  9. thinkphp的钩子的两种配置和两种调用方法

    thinkphp的钩子行为类是一个比较难以理解的问题,网上有很多写thinkphp钩子类的文章,我也是根据网上的文章来设置thinkphp的钩子行为的,但根据这些网上的文章,我在设置的过程中,尝试了十 ...

随机推荐

  1. camstar --飞达上料

    业务场景:某工厂的SMT车间接到生产PCB(3151502),数量1000片.如果实现飞达进行上料,并在贴片机工作时,系统自动进行物料消耗.3151502的BOM为1107790,1107792,11 ...

  2. js-权威指南学习笔记8

    第8章 函数 1.参数有形参和实参的区别,形参相当于函数中定义的变量,实参是在运行时的函数调用时传入的参数. 2.函数表达式可以包含名称,这在递归时很有用. 3.函数定义表达式特别适合用来定义那些只会 ...

  3. php包管理工具最基本的一些问题

    windows下的 1.先安装windows下的set-up程序 点击一步步的, cmd进入,输入composer能成功显示一幅图说明安装成功 2.在下载,https://getcomposer.or ...

  4. 深度学习caffe:Ubuntu16.04安装指南(1)

    caffe [CPU ONLY] 2017-01-15 最简单的安装配置方式: 不用GPU加速,使用OPENCV2.4图像库, 这是根据官方教程(链接如下)简化而得到. Ubuntu 16.04 or ...

  5. vuejs 子组件传递父组件的第一种方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. zend framework 1.10项目配置与经典hello world

    准备工作 前置条件:PHP>=5.14,Apache开启mod_rewrite支持,开启php的pdo扩展. Zend Framework 要求 PHP版本不低于5.1.4,但强烈建议使用 5. ...

  7. Valgrind 快速入门

    1. 介绍 Valgrind工具组提供了一套调试与分析错误的工具包,能够帮助你的程序工作的更加准确,更加快速.这些工具之中最有名的是Memcheck.它能够识别很多C或者C++程序中内存相关的错误,这 ...

  8. PLSQL的一些事儿

    每一个软件都是设计精妙的 plsql就可以使用一些简单代码代替长的语句,比如s=SELECT * FROM 数据插入报错: 原因: 一般情况下,数据库的NLS_CHARACTERSET 为AL32UT ...

  9. [Usaco2008 Dec]Secret Message 秘密信息

    2794: [Usaco2008 Dec]Secret Message 秘密信息 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 7  Solved: 3 ...

  10. zip-auto.sh

    #!/bin/sh #auto zip package #Define Path #####test######### mkdir -p /root/shell/test1 /root/shell/t ...