存在這麼個場景,在資料表彙總,字段值存儲的是以英文逗号’,'相連的字元串,結構如圖所示:
如果想要查詢出字段jq_job_ids中包含8的資料,使用原生SQL也是非常簡單,借助mysql中find_in_set函數就可以實作了
select id, batch_name, jq_job_ids from fa_jq_batch where find_in_set(8, jq_job_ids)
那如果是在tp5架構中該如何實作呢,特别是當存在多個where條件時又該如何構造查詢條件呢,其實通過tp5中的exp就可以實作,示例如下:
if($company_id) $where['jq_company_id'] = $company_id;
if($job_id) $where[] = ['EXP',Db::raw("FIND_IN_SET(8,jq_job_ids)")];
if($batch_name) $where['batch_name'] = ['like',"%$batch_name%"];
$totals = $this->model
->where($where)
->count();
這裡需要注意的是,exp後面的值是一個查詢表達式,在tp5.0.24中必須是一個object才行,這也是為什麼直接寫find_in_set會報錯的原因,在底層Builder.php檔案中,該值必須是Expression的一個執行個體才行
} elseif ('EXP' == $exp) {
// 表達式查詢
if ($value instanceof Expression) {
$whereStr .= '( ' . $key . ' ' . $value->getValue() . ' )';
} else {
throw new Exception('where express error:' . $exp);
}
} elseif (in_array($exp, ['NOT NULL', 'NULL'])) {
備注:tp版本是5.0.24,可能版本不同,寫法也不同,具體要看底層查詢條件是如何構造的
轉載-------落日長煙