问题来源:

现有一张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. ubuntu12.04+fuerte 下跑通lsd-slam——数据集

    lsd-slam(下载链接:https://github.com/tum-vision/lsd_slam)提供了两种方法,一种是用数据集(下载地址http://vision.in.tum.de/lsd ...

  2. Android 控件布局常用属性

    <!--单个控件经常用到android:id —— 为控件指定相应的IDandroid:text —— 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串a ...

  3. iOS 界面布局,设置约束

    1. 设置控件的宽度是父视图的宽度的1/2 在控件上按住ctrl,按住鼠标左键,拖动到父视图,这时出来一个选项,选中aspect 在Multiplier中填上1:2 即可,其它的比例也是这样 2. 设 ...

  4. 微信网页授权redirect_uri错误的可能错误之一

    授权回调页面域名 后面不要加/ 加了/ 就会出错.

  5. 为什么32位操作系统最大支持4GB内存

    因为32位操作系统的地址空间为32位,地址总数为2^32,每个地址对应1Byte内存空间,这样,32位操作系统管理的最大内存空间限制为2^32Byte=4*1024*1024*1024Byte,即4G ...

  6. Delphi判断一个字符是否为汉字的最佳方法

    //判断字符是否是汉字 function IsHZ(ch: WideChar): boolean; var i:integer; begin i:=ord(ch); if( i<19968) o ...

  7. JSP EL表达式使用

    JSP EL表达式使用: Servlet: package com.stono.servlet; import java.io.IOException; import java.util.HashMa ...

  8. 如何在windows xp下实现声音内录

    问题描述: 用屏幕录制软件录制一个视频,能够成功录制视频,但无法录制视频里面的声音. 问题原因: 因为现在的多数声卡,均无法直接通过声卡自身的功能实现内录和立体声混音. 这是由于声卡芯片厂商迫于RIA ...

  9. .net判断System.Data.DataRow中是否包含某列

    大家对将DataRow转成实体对象并不陌生,转成实体的时候一般都会加上这个判断  if (row["字段名"] != null && row["字段名&q ...

  10. MySQL管理命令

    1.验证MySQL安装 在成功安装Mysql后,一些基础表会表初始化,在服务器启动后,你可以通过简单的测试来验证Mysql是否工作正常. 使用 mysqladmin 工具来获取服务器状态: 使用 my ...