如題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] ];
便可