如题
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]];
即可