Ответ 1
Использование
$this->db->start_cache();
Перед началом построения запроса и
$this->db->stop_cache();
После завершения построения запроса. Кроме того, используйте
$this->db->flush_cache();
После остановки кеша.
Я использую CodeIgniter и имею случай, когда две таблицы (проекты и задачи) необходимо обновить со значением сразу после друг друга (для активного столбца необходимо установить значение "n" ). Код, который я использую:
function update($url, $id)
{
$this->db->where('url', $url);
$this->db->update('projects', array('active' => 'n'));
$this->db->where('eventid', $id);
$this->db->update('tasks', array('active' => 'n'));
}
С помощью этого кода таблица проектов обновляется, а таблица задач - нет. Если я закомментирую $this- > db- > update ('projects', array ('active' = > 'n')); затем обновляется таблица задач.
Я считаю, что это имеет какое-то отношение к кешированию, но я попытался flush_cache перед вызовом db- > update задач, но это не имело никакого эффекта.
Может кто-нибудь объяснить, как последовательные запросы обновления могут быть выполнены с помощью CodeIgniter?
Использование
$this->db->start_cache();
Перед началом построения запроса и
$this->db->stop_cache();
После завершения построения запроса. Кроме того, используйте
$this->db->flush_cache();
После остановки кеша.
Это работает:
$this->db->flush_cache();
Если вы не выполняете get() или аналогичный CI, он не всегда очищает кеш. Окончательный код выглядит следующим образом:
$this->db->from('table');
$this->db->where('field', $field);
$count = $this->db->count_all_results();
$this->db->flush_cache();
Попробуйте позвонить $this->db->reset();
после первого вызова update
.
EDIT: meh, попробуйте $this->db->_reset_write();
, чтобы очистить все следы запроса.
Для версии 3 Codeigniter правильный способ:
$db->reset_query()
Как найти здесь: http://www.codeigniter.com/userguide3/database/query_builder.html#resetting-query-builder
Во втором вызове обновления вам нужен url-код? если это так, после того, как вы вызовете первое обновление, что данные больше не доступны для второго. Вам нужно будет снова установить:
function update($url, $id)
{
$this->db->where('url', $url);
$this->db->update('projects', array('active' => 'n'));
$this->db->where('url', $url);
$this->db->where('eventid', $id);
$this->db->update('tasks', array('active' => 'n'));
}
// Alternatively
function update($url, $id)
{
$where_bit = array(
'url' => $url,
);
$this->db->update('projects', array('active' => 'n'), $where_bit);
$where_bit['event_id'] = $id;
$this->db->update('tasks', array('active' => 'n'), $where_bit);
}
Обновление активной записи CI поддерживает условие where, которое должно быть передано в виде массива key = > value в качестве третьего параметра (также как строка, но id рекомендует использовать массив)
попробуйте
$this->db->reconnect();
после вашего запроса.
Добрый день!