Codeigniter's `where` and `or_where`

I'm trying to specify a query in my model

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

So, the trouble i'm having is with my or_where. I want the or to be restricted to only the available_until field. Currently, however, i'm getting results which have a language of German which isn't what i want. How do i restrict my or_where filter to the available_until field only?

5 Answers

You can modify just the two lines:

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

Omitting the FALSE parameter would have placed the backticks before the brackets and make them a part of the table name/value, making the query unusable.

The NULL parameter is there just because the function requires the second parameter to be a value, and since we don't have one, we send NULL.

2

You may group your library.available_until wheres area by grouping method of Codeigniter for without disable escaping where clauses.

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

Reference:

0

You can change your code to this:

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

Tip: to watch the generated query you can use

echo $this->db->last_query(); die(); 

You can use : Query grouping allows you to create groups of WHERE clauses by enclosing them in parentheses. This will allow you to create queries with complex WHERE clauses. Nested groups are supported. Example:

$this->db->select('*')->from('my_table') ->group_start() ->where('a', 'a') ->or_group_start() ->where('b', 'b') ->where('c', 'c') ->group_end() ->group_end() ->where('d', 'd') ->get(); 

1
$this->db->where('(a = 1 or a = 2)'); 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like