Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 518
bhanushalimahesh3 Avatar asked Sep 15 '15 19:09

bhanushalimahesh3


1 Answers

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);
}
like image 175
Tpojka Avatar answered Oct 23 '22 03:10

Tpojka