TP5 借助EXP實現FIND_IN_SET查詢


存在這么個場景,在數據表匯總,字段值存儲的是以英文逗號’,'相連的字符串,結構如圖所示:
在這里插入圖片描述
如果想要查詢出字段jq_job_ids中包含8的數據,使用原生SQL也是非常簡單,借助mysql中find_in_set函數就可以實現了

1 select id, batch_name, jq_job_ids from fa_jq_batch where find_in_set(8, jq_job_ids)

那如果是在tp5框架中該如何實現呢,特別是當存在多個where條件時又該如何構造查詢條件呢,其實通過tp5中的exp就可以實現,示例如下:

1 if($company_id) $where['jq_company_id'] = $company_id; 2 if($job_id) $where[] = ['EXP',Db::raw("FIND_IN_SET(8,jq_job_ids)")]; 3 if($batch_name) $where['batch_name'] = ['like',"%$batch_name%"]; 4 
5 $totals = $this->model 6     ->where($where) 7     ->count();

這里需要注意的是,exp后面的值是一個查詢表達式,在tp5.0.24中必須是一個object才行,這也是為什么直接寫find_in_set會報錯的原因,在底層Builder.php文件中,該值必須是Expression的一個實例才行

1 } elseif ('EXP' == $exp) { 2     // 表達式查詢
3     if ($value instanceof Expression) { 4         $whereStr .= '( ' . $key . ' ' . $value->getValue() . ' )'; 5     } else { 6         throw new Exception('where express error:' . $exp); 7  } 8 } elseif (in_array($exp, ['NOT NULL', 'NULL'])) {

備注:tp版本是5.0.24,可能版本不同,寫法也不同,具體要看底層查詢條件是如何構造的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM