Codeigniter `where` и` 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')
Итак, проблема, с которой я столкнулась, связана с моим or_where
. Я хочу, чтобы or
ограничивался только полем available_until
. В настоящее время, однако, я получаю результаты, у которых есть немецкий язык, которого я не хочу. Как ограничить фильтр or_where
только в поле available_until
?
Ответы
Ответ 1
Вы можете изменить только две строки:
->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:
Опускание параметра FALSE
помещало бы обратные элементы перед скобками и делало бы их частью имени/значения таблицы, делая запрос непригодным.
Параметр NULL
существует только потому, что функция требует, чтобы второй параметр был значением, а поскольку у нас его нет, мы отправляем NULL.
Ответ 2
Вы можете изменить свой код на это:
$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');
Совет: для просмотра сгенерированного запроса вы можете использовать
echo $this->db->last_query(); die();
Ответ 3
Вы можете сгруппировать свою библиотеку.available_until wheres area, используя метод группировки Codeigniter для без отключения экранирования 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')
Ссылка: https://www.codeigniter.com/userguide3/database/query_builder.html#query-grouping
Ответ 4
Вы можете использовать: группировка запросов позволяет создавать группы предложений WHERE, заключая их в круглые скобки. Это позволит вам создавать запросы с помощью сложных предложений WHERE. Вложенные группы поддерживаются. Пример:
$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
Ответ 5
$this->db->where('(a = 1 or a = 2)');