Это моя проблема: 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);