天天看點

TP5 借助EXP實作FIND_IN_SET查詢

存在這麼個場景,在資料表彙總,字段值存儲的是以英文逗号’,'相連的字元串,結構如圖所示:

TP5 借助EXP實作FIND_IN_SET查詢

如果想要查詢出字段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,可能版本不同,寫法也不同,具體要看底層查詢條件是如何構造的

轉載-------落日長煙