存在這么個場景,在數據表匯總,字段值存儲的是以英文逗號’,'相連的字符串,結構如圖所示:
如果想要查詢出字段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,可能版本不同,寫法也不同,具體要看底層查詢條件是如何構造的