CodeIgniter Active Record – операторы группы OR

Это моя проблема: MySQL «Или» Условие

Решение состоит в группировке операторов OR, но я использую CodeIgniters Active Record. Есть ли способ группировать операторы OR с помощью Active Record? Или я должен сам написать запрос?

Я использую $this->db->where() с $this->db->or_where()

Он пишет запрос следующим образом:

WHERE title = 'foobar' AND category = 2 OR category = 3

но мне нужно:

WHERE title = 'foobar' AND (category = 2 OR category = 3)

Я не могу этого сделать:

 $this->db->where("title = 'foobar' AND (category = 2 OR category = 3)"); 

потому что я добавляю ORs, используя цикл foreach

Вы можете сделать это вручную, как указано здесь :

Пользовательская строка: вы можете написать свои собственные статьи вручную:

$ where = "name = 'Joe' AND status = 'boss' OR status = 'active'";

$ This-> db-> где ($ где);

Что касается вашего вопроса:

 $this->db->where("category = 1 AND (category = 2 OR category = 3)"); 

В 3.0-dev :

 $this->db->select() ->group_start() ->or_like([ 'category' => 2, 'category' => 3 ]) ->group_end() ->where([ 'category' => 1 ]); 

Обновить

См. Ответы на этот вопрос, если вы используете CI 2.2. Выберите ответ, отличный от принятого .

Или просто попробуйте следующее :

 $categories = array(2, 3); array_walk($categories, function(&$cat) { $cat = 'category = ' . $cat; }); $catstring = implode(" OR ", $categories); $where = "category = 1 AND ($catstring)"; // => category = 1 AND (category = 2 OR category = 3) $this->db->where($where); 

как указано в OP, вы генерируете ИЛИ, используя foreach (array) вы можете просто использовать

  $cat_array=array(2,3,4,5,6,7); $this->db->select('col1, col2')->from('table')->where("col1",1)->where_in('col2', $cat_array); 

будет генерировать

 SELECT `col1`, `col2` FROM (`table`) WHERE `col1` = 1 AND `col2` IN (2, 3, 4, 5, 6, 7) 

вы не можете манипулировать запросом на состояние, используя методы активной записи DB (где, or_where), я бы рекомендовал пройти как жало в методе where()

 $this->db->where("category = 1 AND (category = 2 OR category = 3)"); 

В Code Igniter версии 3.0-dev вы можете добавлять группы в любой запрос с помощью group_start и group_end :

 $this->db->select('col1, col2') ->where("category = 1") ->group_start() ->where("category = 2") ->or_where("category = 3") ->group_end(); 

Производит:

 SELECT `col1`, `col2` FROM `table_name` WHERE category = 1 AND (category = 2 OR category = 3);