2013-05-11 7 views
12

私はだから私のモデルにCodeIgniterの `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です。私はoravailable_untilフィールドに限定して欲しいです。現在、しかし、私は私がしたいものではないドイツ語の言語を持っている結果を得ています。 or_whereフィルタをavailable_untilフィールドにのみ制限するにはどうすればよいですか?

答えて

26

あなただけの2行を変更することができます。

->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) 

EDIT:

は、括弧の前にバッククォートを置き、それらにテーブルの名前/値の一部を作るだろうFALSEパラメータを省略することクエリは使用できません。

NULLパラメータは、2番目のパラメータが値でなければならないという理由だけであり、1つもないので、NULLを送信します。

+0

だから、これが機能するようになりましたが、私は理由を知りません。どうか説明できますか?私は 'false'がクエリへのbackticksの追加を妨げることを知っています。しかし、これがどのようにこのクエリに関係しているのか、私は理解していません。また、nullのparamが何をしているのかわかりません。 – garethdn

+0

@garethdn私は私の答えを編集しました。 –

+0

このメソッドは機能しますが、素敵なコードの標準にはなりません。 where句には閉じられていないpharantesisを使用することはできません。 –

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') 

ヒント:あなたが使用することができます生成されたクエリを見てます$ this-> DB-> last_query();あなたがグループかもしれ

4

CodeIgniterのの方法をグループ化によってあなたの library.available_untilのwheres面積のない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

関連する問題