Множественный запрос LIKE db с использованием ассоциативного массива, но все из одного и того же имени столбца?

Я пытаюсь запросить свою базу данных, используя класс активной записи CodeIgniter. У меня есть несколько сообщений в блогах, хранящихся в таблице. Запрос предназначен для функции поиска, которая выведет все сообщения, которым назначены определенные категории. Таким образом, столбец «категория» таблицы будет иметь список всех категорий для этого сообщения в произвольном порядке, разделенных запятыми, например: политика, история, социология. и т.п.

Если пользователь выбирает, скажем, «Политика» и «История», должны быть возвращены заголовки всех сообщений, которые имеют ОБЕ эти категории.

Итак, список запрашиваемых категорий будет массивом $cats. Я думал, что это сработает -

foreach ($cats as $cat){
    $this->db->like('categories',$cat);
}

Произведя это:

$this->db->like ('categories','Politics');
$this->db->like ('categories','History');

(Что даст: «ГДЕ категории КАК «%Политика%» И категории КАК «%История%»)

Но это не работает, похоже, выдает только первое утверждение. Я предполагаю, что проблема заключается в том, что имя столбца одинаково для каждого из связанных запросов. Похоже, в руководстве пользователя CI ничего об этом нет (http://codeigniter.com/user_guide/database/active_record.html), поскольку они, кажется, предполагают, что каждый связанный оператор будет для другого имени столбца.

Конечно, невозможно использовать ассоциативный массив в одном выражении, так как он должен содержать повторяющиеся ключи — в этом случае каждый ключ должен быть «категорией»...


person Inigo    schedule 17.01.2011    source источник
comment
Никто? Мой вопрос понятен?   -  person Inigo    schedule 17.01.2011


Ответы (2)


Что касается MySQL, я только что выполнил следующий запрос в своей базе данных, и проблем не было.

 SELECT * 
 FROM  `TicketUpdates` 
 WHERE content LIKE  '%update%'
 AND content LIKE  '%footprints%';

Точно так же следующий код работал, как и ожидалось:

 $this->db->select('*'); 
 $this->db->from('TicketUpdates');
 $this->db->like('content', 'update');   
 $this->db->like('content', 'footprints');       
 print_r($this->db->get()->result());

Если вы используете функцию «нравится» в CI, вы должны добавлять к ним префикс и постфикс с соответствующими функциями запроса, например:

 $this->db->select('*');
 $this->db->from('tablename');
 foreach($cats as $cat){
    $this->db->like('categories', $cat);
 }
 $result = $this->db->get();
person Sean Madden    schedule 17.01.2011
comment
Спасибо, Шон, да, я понимаю, что за пунктами должна следовать функция «получить» и т. Д. Я фактически решил это сейчас, это была проблема с самим входным массивом ... Но все же спасибо. - person Inigo; 18.01.2011

вы можете использовать следующий код

$this->db->select("*")->from($table);

foreach($cats as $single_name)
        $this->db->or_like("categories",$single_name);

$result = $this->db->get();
person Rajan    schedule 09.05.2012