bhanushalimahesh3
bhanushalimahesh3

Reputation: 127

Single transaction on multiple model function with CodeIgniter

I need to insert into 2 tables if anything goes wrong while inserting in any of the table I want to rollback commited queries.

I wrote queries inside controller for example:

   $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
   }

This works perfectly. But I think it's not good practice to write queries inside controller. So I did this, called model function and I wrote those insert_batch queries in respective model function.

$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`
} 

but this didnt work as expected

Upvotes: 6

Views: 5210

Answers (3)

Terry Lin
Terry Lin

Reputation: 2599

I am using CI 3 and I can use single transaction on multiple model in Controller. I have tried to insert error data to test if rollback or not, the transaction is successfully rollback.

I did not use Tpojka's anwser but my model methods return true or false. Everything seems okay.

Upvotes: 0

Tpojka
Tpojka

Reputation: 7111

You changed places of queries in those examples regarding names in case it matters. I think that you can't have tied transactions between different methods (your second example). But you can and should set your DB related code to model.

So make those queries in model:

// 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);
}

Upvotes: 5

Keval Rathi
Keval Rathi

Reputation: 986

First shift your db related operation in module and then start transaction.

Sample code in module,

 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);
  }

and your controller call this function

sample code in controller,

function inser_user_data()
{
   $result = $this->module_name->maincategoryData($marketData,$maincategoryData)
   if($result == FALSE)
   {
       throw error
       `enter code here`
   }
   else
   {
      //data inserted successfully
   }
} 

Upvotes: 0

Related Questions