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

 便可

相關文章
相關標籤/搜索