Одна транзакция на функции множественной модели с 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 2

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 . Кажется, все в порядке.