是否可以在CodeIgniter中回滚函数操作

时间:2016-09-22 12:02:17

标签: php mysql codeigniter

假设我不想在codeigniter中将数据插入2个不同的表中,

例如:

  • 插入 UserProfile 表:name,mail to (获取id并在下表中使用它)

  • 插入员工表:UserProfile_id,轮班,职位。

到目前为止,一切都运行良好,如果我只想在两个插入都被提交的情况下提交动作,我该怎么办...如果第一次插入顺利且我不想要的话我怎么能回滚空档案.... 我的问题是,一旦第一次插入被提交,假设在下一次插入时出现了问题 - 我将数据提供给一个表...任何想法?

2 个答案:

答案 0 :(得分:1)

是的,您可以使用codeigniter的事务来完成您的任务,因为只有在您的所有查询都成功执行的情况下,它才会插入或提交您的数据。

要使用交易运行您的查询,您将使用$ this-> db-> trans_start()和$ this-> db-> trans_complete()函数,如下所示:

$this->db->trans_start();
   $this->db->query('AN SQL QUERY...');
   $this->db->query('ANOTHER QUERY...');
   $this->db->query('AND YET ANOTHER QUERY...');
$this->db->trans_complete();

因此,您只需要在$this->db->trans_start();$this->db->trans_complete();

之间覆盖您的查询

参考:https://www.codeigniter.com/user_guide/database/transactions.html

答案 1 :(得分:1)

请参阅codeigniter中的Transactions

语法(在Document中也给出):

$this->db->trans_begin();

$this->db->query('AN SQL QUERY...');
$this->db->query('ANOTHER QUERY...');
$this->db->query('AND YET ANOTHER QUERY...');

if ($this->db->trans_status() === FALSE)
{
        $this->db->trans_rollback();
}
else
{
        $this->db->trans_commit();
}
  

确保在运行手动时使用$ this-> db-> trans_begin()   交易,不是$ this-> db-> trans_start()。

另见strict-mode

<强>已更新

对于多种型号,您可以采用这种方式(我的观点),不确定它是否是唯一/最好的一种:

// MODEL_x

public function functionX($data)
{
    return  $this->db->insert('table_x',$data);
}
// MODEL_y

public function functionY($data)
{
    return  $this->db->insert('table_y',$data);
}

//controller
$this->db->trans_start();
$this->model_x->functionX();
$this->model_y->functionY();
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
  //log error  
}