web-dev-qa-db-fra.com

`Where` et` or_where` de Codeigniter

J'essaie de spécifier une requête dans mon modèle

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

Donc, le problème que j'ai est avec mon or_where. Je veux que la or soit limitée au champ available_until. Actuellement, cependant, j'obtiens des résultats qui ont une langue allemande qui n'est pas ce que je veux. Comment puis-je limiter mon filtre or_where au champ available_until uniquement?

13
garethdn

Vous pouvez modifier uniquement les deux lignes:

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

MODIFIER:

L'omission du paramètre FALSE aurait placé les guillemets avant les crochets et en ferait une partie du nom/de la valeur de la table, rendant la requête inutilisable.

Le paramètre NULL existe uniquement parce que la fonction requiert que le deuxième paramètre soit une valeur et, comme nous n'en avons pas, nous envoyons NULL.

27
Yan Berk

Vous pouvez changer votre code en ceci:

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

Astuce: pour regarder la requête générée, vous pouvez utiliser $ this-> db-> last_query ();

14
m4t1t0

Vous pouvez grouper votre zone library.available_until wherees par la méthode grouping de Codeigniter pour sans désactiver les clauses escapade 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')

Référence: https://www.codeigniter.com/userguide3/database/query_builder.html#query-grouping

10
MERT DOĞAN
$this->db->where('(a = 1 or a = 2)');
1
Ali Özyıldırım