博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TP 框架没有考虑完善的功能点:1、表达式查询不支持INSTR形式的查询
阅读量:6840 次
发布时间:2019-06-26

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

hot3.png

如题

TP框架支持表达式查询,LT IN BETWEEN等,还可以使用 EXP 来表征直接使用原生级的表达式,但此方式都是以关联数组,key(column) => value(other condition) 的方式,而且解析时都是以 key other condition 的方式,比如 ["id"] => ["EXP", "IN (1, 2, 3, 4)"] 会被解析为 `id` IN (1, 2, 3, 4),但当你想要使用 INSTR 类型的查询就做不到了:

比如 WHERE INSTR(`id_set`, "1,"),我们想查询在 `id_set` 字段中含有给定的数值数据,这里与 IN 不同在于字段名是被包含在了函数里,而不是 column condition 的这种方式,但 TP 的解析都是按 key 为 column,value 为 condition 另作解析的方式来解析表达式查询的关联数组。

改进很简单,甚至说很鸡肋,不过我觉得平时还是会有人在某些场景下需要这种功能吧

ThinkPHP\Library\Think\Db\Driver.class.php

\Think\Db\Driver::parseWhereItem

在 exp 的判断分支中

if ('exp' == $exp) { // 使用表达式    $whereStr .= $key . ' ' . $val[1];}

改为(代码里是 elseif 判断 我为了好看所以 if 了 请灵活理解)

if ('exp' == $exp) { // 使用表达式    if ($val[2]) { // ["EXP", "INSTR(`id_set`, $id)", true]        $whereStr .= $val[1];    } else {        $whereStr .= $key . ' ' . $val[1];    }}

增加第三个元素,true 为隐士表达式查询,默认为 false 显示表达式查询,也就是TP默认的

后期使用只需要

$map = [    "age" => ["LT", $age],    "name" => ["EXP", ["INSTR(`name`, '$name')"], true]];

 即可

转载于:https://my.oschina.net/sallency/blog/812814

你可能感兴趣的文章
工具,算法驱动嵌入式视觉快速发展
查看>>
门店订货及在线签名免费开源方案
查看>>
Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现
查看>>
Android底层学习之Linux基础
查看>>
手摸手教你写 Kubernetes 的 golang 服务
查看>>
JAVA学习day03
查看>>
p2p-如何拯救k8s镜像分发的阿喀琉斯之踵
查看>>
Atom 1.36.1 发布,跨平台文本编辑器
查看>>
流行 Ruby 库曝出恶意后门代码,作者未知
查看>>
2018-过年记
查看>>
动态列报表的制作
查看>>
通通玩blend美工(5)——旋转木马,交互性设计
查看>>
得到简历方法
查看>>
WebView与Javascript交互及JS的注入
查看>>
记录一次docker集群中搭建mongodb副本集
查看>>
[剑指offer] 变态跳台阶
查看>>
首次公开!阿里搜索中台开发运维一体化实践
查看>>
面象对象设计6大原则之四:接口隔离原则
查看>>
Ansible介绍、安装、远程执行命令、拷贝文件或者目录、远程执行脚本
查看>>
异常中要了解的Throwable类中的几个方法
查看>>