2013-05-11 12 views
12

Próbuję określić kwerendę w moim modeluCodeIgniter na `where` i` 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') 

Tak, mam kłopot jest z moim or_where. Chcę, aby or było ograniczone tylko do pola . Obecnie jednak otrzymuję wyniki z językiem niemieckim, którego nie chcę. W jaki sposób mogę ograniczyć mój filtr or_where tylko do pola available_until?

Odpowiedz

26

Można modyfikować tylko te dwie linie:

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

Pominięcie parametru FALSE byłby umieszczone odwrócone, pojedyncze apostrofy przed nawiasami i uczynić z nich część nazwy tabeli/wartość, dzięki czemu zapytanie nie nadaje się do użytku.

Parametr NULL jest dostępny tylko dlatego, że funkcja wymaga, aby drugi parametr był wartością, a ponieważ go nie mamy, wysyłamy NULL.

+0

Tak to działa teraz, ale nie wiem dlaczego. Czy możesz wyjaśnić, proszę? Wiem, że 'false' zapobiega dodawaniu backticków do zapytania. Nie rozumiem jednak, w jaki sposób ma to wpływ na to zapytanie - nie jestem również pewien, jaki parametr "null" ma – garethdn

+0

@garethdn Edytowałem swoją odpowiedź. –

+0

Ta metoda działa, ale nie może być standardem dla ładnego kodu. Nie możesz używać niezamkniętej pharantesis w klauzulach where. –

12

Można zmienić swój kod do tego:

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

Wskazówka: aby oglądać wygenerowanego zapytania można użyć $ this-> db-> last_query();

4

Użytkownik może grupa Twój library.available_until wheres obszar przez grupującego metodę dla CodeIgniter bez wyłączenia uciekając gdzie klauzule.

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

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