2013-05-11 33 views
12

我想在我的模型笨的`where`和`or_where`

$this->db 
     ->select('*') 
     ->from('library') 
     ->where('library.rating >=', $form['slider']) 
     ->where('library.votes >=', '1000') 
     ->where('library.language !=', 'German') 
     ->where('library.available_until >=', date("Y-m-d H:i:s")) 
     ->or_where('library.available_until =', "00-00-00 00:00:00") 
     ->where('library.release_year >=', $year_start) 
     ->where('library.release_year <=', $year_end) 
     ->join('rating_repo', 'library.id = rating_repo.id') 

所以要指定查詢,我遇到的麻煩是我的or_where。我希望or僅限於available_until字段。然而,目前,我得到的結果有德語的語言,這不是我想要的。如何限制我的or_where篩選器僅限於available_until字段?

回答

26

您可以修改只是兩行:

->where('(library.available_until >=', date("Y-m-d H:i:s"), FALSE) 
->or_where("library.available_until = '00-00-00 00:00:00')", NULL, FALSE) 

編輯:

省略FALSE參數會放在反引號中的括號前,讓他們的表名/值的一部分,使該查詢不可用。

NULL參數在那裏只是因爲該函數需要第二個參數是一個值,並且因爲我們沒有一個,我們發送NULL。

+0

所以這個工作了,但我不知道爲什麼。你能解釋一下嗎?我知道'false'防止向查詢中添加反引號。但是,我不明白這對這個查詢有什麼影響 - 我也不確定'null'參數是什麼 – garethdn 2013-05-11 16:34:42

+0

@garethdn我編輯了我的答案。 – 2013-05-11 16:49:39

+0

此方法可行,但不能成爲漂亮代碼的標準。你可能不會在where子句中使用unclosed pharantesis。 – 2017-11-14 07:25:55

12

您可以更改您的代碼如下:

$where_au = "(library.available_until >= '{date('Y-m-d H:i:s)}' OR library.available_until = '00-00-00 00:00:00')"; 
$this->db 
     ->select('*') 
     ->from('library') 
     ->where('library.rating >=', $form['slider']) 
     ->where('library.votes >=', '1000') 
     ->where('library.language !=', 'German') 
     ->where($where_au) 
     ->where('library.release_year >=', $year_start) 
     ->where('library.release_year <=', $year_end) 
     ->join('rating_repo', 'library.id = rating_repo.id') 

提示:看你可以使用生成的查詢$這個 - > DB-> last_query();

4

你可以組你的library.available_until何在通過分組笨的方法面積沒有禁用轉義where子句。

$this->db 
    ->select('*') 
    ->from('library') 
    ->where('library.rating >=', $form['slider']) 
    ->where('library.votes >=', '1000') 
    ->where('library.language !=', 'German') 
    ->group_start() //this will start grouping 
    ->where('library.available_until >=', date("Y-m-d H:i:s")) 
    ->or_where('library.available_until =', "00-00-00 00:00:00") 
    ->group_end() //this will end grouping 
    ->where('library.release_year >=', $year_start) 
    ->where('library.release_year <=', $year_end) 
    ->join('rating_repo', 'library.id = rating_repo.id') 

參考:https://www.codeigniter.com/userguide3/database/query_builder.html#query-grouping