使用CodeIgniter在多个模型函数上进行单个事务

时间:2015-09-15 19:36:37

标签: codeigniter model transactions

如果在插入任何表中我想要回滚提交的查询时出现任何问题,我需要插入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 个答案:

答案 0 :(得分:4)

您在这些示例中更改了有关名称的查询位置,以防万一。我认为你不能在不同的方法之间绑定交易(你的第二个例子)。但您可以而且应该将与数据库相关的代码设置为建模。

所以在模型中进行这些查询:

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

答案 1 :(得分:0)

首先在模块中移动与数据库相关的操作,然后启动事务。

模块中的示例代码,

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

答案 2 :(得分:0)

我正在使用CI 3,我可以在Controller中的多个模型上使用单个事务。 我试图插入错误数据来测试是否回滚,事务成功回滚。

我没有使用Tpojka的anwser,但我的模型方法返回 true false 。一切似乎都没问题。