TP 框架没有考虑完善的功能点:一、表达式查询不支持INSTR形式的查询

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

 便可

相关文章
相关标签/搜索