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