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?
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.
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 ();
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
$this->db->where('(a = 1 or a = 2)');