Одна транзакция на функции множественной модели с CodeIgniter
Мне нужно вставить в 2 таблицы, если что-то пойдет не так при вставке в любую из таблиц, которые я хочу откатить запущенные запросы.
Я писал запросы внутри контроллера например:
$this->db->trans_start();
$this->db->insert_batch('market_users_mapping', $marketData);
$this->db->insert_batch('maincategory_users_mapping', $maincategoryData);
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
throw error
}
Это работает отлично. Но я думаю, что это не очень хорошая практика, чтобы писать запросы внутри контроллера. Так что я сделал это, называется функцией модель, и я написал эти запросы insert_batch в соответствующей функцией модель.
$this->db->trans_start();
$this->maincategory_model->function_name()
$this->market_model->function_name();
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
throw error
`enter code here`
}
Но это не сработало, как ожидалось
3 ответа:
Вы изменили места запросов в этих примерах относительно имен, если это имеет значение. Я думаю, что вы не можете связать транзакции между различными методами (ваш второй пример). Но вы можете и должны установить свой код, связанный с БД, в модель.
Поэтому сделайте эти запросы в модели:
// controller code $this->db->trans_start(); $this->maincategory_model->first_function($maincategoryData); $this->market_model->second_function($marketData); $this->db->trans_complete(); if ($this->db->trans_status() === FALSE) { throw error `enter code here` } // Maincategory_model code public function first_function($maincategoryData) { return $this->db->insert_batch('maincategory_users_mapping', $maincategoryData); } // Market_model code public function second_function($marketData) { return $this->db->insert_batch('market_users_mapping', $marketData); }
Сначала переместите связанную с БД операцию в модуль, а затем запустите транзакцию.
Пример кода в модуле,
First module : function insert_data_market_maincategory($marketData,$maincategoryData) { $status = TRUE; $this->db->trans_start(); $this->db->insert_batch('market_users_mapping', $marketData); $this->second_module_name->maincategoryData($maincategoryData) $this->db->trans_complete(); if ($this->db->trans_status() === FALSE) { $status = FALSE; } return $status; } second module : function maincategoryData($data) { $this->db->insert_batch('table_name', $data); }
И ваш контроллер вызывает эту функцию
Пример кода в контроллере,
function inser_user_data() { $result = $this->module_name->maincategoryData($marketData,$maincategoryData) if($result == FALSE) { throw error `enter code here` } else { //data inserted successfully } }
Я использую CI 3 и могу использовать одну транзакцию на нескольких моделях в контроллере. Я попытался вставить данные об ошибках, чтобы проверить, если откат или нет, транзакция успешно откатывается.
Я не использовал anwser Tpojka, но мои методымодели возвращаютtrue илиfalse . Кажется, все в порядке.