如题php
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.phpcode
\Think\Db\Driver::parseWhereItemit
在 exp 的判断分支中io
if ('exp' == $exp) { // 使用表达式 $whereStr .= $key . ' ' . $val[1]; }
改成(代码里是 elseif 判断 我为了好看因此 if 了 请灵活理解)class
if ('exp' == $exp) { // 使用表达式 if ($val[2]) { // ["EXP", "INSTR(`id_set`, $id)", true] $whereStr .= $val[1]; } else { $whereStr .= $key . ' ' . $val[1]; } }
增长第三个元素,true 为隐士表达式查询,默认为 false 显示表达式查询,也就是TP默认的map
后期使用只须要数据
$map = [ "age" => ["LT", $age], "name" => ["EXP", ["INSTR(`name`, '$name')"], true] ];
便可