zoukankan      html  css  js  c++  java
  • TP5 借助EXP实现FIND_IN_SET查询

    存在这么个场景,在数据表汇总,字段值存储的是以英文逗号’,'相连的字符串,结构如图所示:
    在这里插入图片描述
    如果想要查询出字段jq_job_ids中包含8的数据,使用原生SQL也是非常简单,借助mysql中find_in_set函数就可以实现了

    1 select id, batch_name, jq_job_ids from fa_jq_batch where find_in_set(8, jq_job_ids)

    那如果是在tp5框架中该如何实现呢,特别是当存在多个where条件时又该如何构造查询条件呢,其实通过tp5中的exp就可以实现,示例如下:

    1 if($company_id) $where['jq_company_id'] = $company_id;
    2 if($job_id) $where[] = ['EXP',Db::raw("FIND_IN_SET(8,jq_job_ids)")];
    3 if($batch_name) $where['batch_name'] = ['like',"%$batch_name%"];
    4 
    5 $totals = $this->model
    6     ->where($where)
    7     ->count();

    这里需要注意的是,exp后面的值是一个查询表达式,在tp5.0.24中必须是一个object才行,这也是为什么直接写find_in_set会报错的原因,在底层Builder.php文件中,该值必须是Expression的一个实例才行

    1 } elseif ('EXP' == $exp) {
    2     // 表达式查询
    3     if ($value instanceof Expression) {
    4         $whereStr .= '( ' . $key . ' ' . $value->getValue() . ' )';
    5     } else {
    6         throw new Exception('where express error:' . $exp);
    7     }
    8 } elseif (in_array($exp, ['NOT NULL', 'NULL'])) {

    备注:tp版本是5.0.24,可能版本不同,写法也不同,具体要看底层查询条件是如何构造的

     
  • 相关阅读:
    用工具爬虎牙星秀VS用代码
    mysql简单的操作
    MySQL5.1的安装过程
    MySQL的安装
    SQL server 2008 的安装
    数据库基础知识
    HTTP协议
    TCP协议
    web系统基础
    软件测试缺陷的定义、产生原因、缺陷报告格式、缺陷报告
  • 原文地址:https://www.cnblogs.com/cyfblogs/p/13963774.html
Copyright © 2011-2022 走看看