it-swarm.com.de

Codeigniter`s "where" und "or_where"

Ich versuche, eine Abfrage in meinem Modell anzugeben

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

Das Problem, das ich habe, ist also mit meinem or_where. Ich möchte, dass or nur auf das available_until-Feld beschränkt ist. Momentan bekomme ich jedoch Ergebnisse mit einer deutschen Sprache, die ich nicht will. Wie beschränke ich meinen or_where-Filter nur auf das available_until-Feld?

13
garethdn

Sie können nur die beiden Zeilen ändern:

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

BEARBEITEN:

Wenn Sie den Parameter FALSE auslassen, wurden die Backticks vor den Klammern platziert und als Teil des Tabellennamens/-werts angezeigt, wodurch die Abfrage unbrauchbar wird.

Der NULL-Parameter ist nur deshalb vorhanden, weil für die Funktion der zweite Parameter ein Wert ist, und da wir keinen haben, senden wir NULL.

27
Yan Berk

Sie können Ihren Code folgendermaßen ändern:

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

Tipp: Um die generierte Abfrage anzusehen, können Sie $ this-> db-> last_query () verwenden.

14
m4t1t0

Sie können Ihre library.available_until wheres-Bereich nach der grouping - Methode von Codeigniter gruppieren, ohne dass dabei die Escape-Klausel where deaktiviert wird.

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

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

10
MERT DOĞAN

Sie können Folgendes verwenden: Mithilfe der Abfragegruppierung können Sie Gruppen von WHERE-Klauseln erstellen, indem Sie sie in Klammern einschließen. Auf diese Weise können Sie Abfragen mit komplexen WHERE-Klauseln erstellen. Geschachtelte Gruppen werden unterstützt. Beispiel:

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

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

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