假设我不想在codeigniter中将数据插入2个不同的表中,
例如:
插入 UserProfile 表:name,mail to (获取id并在下表中使用它)
插入员工表:UserProfile_id,轮班,职位。
到目前为止,一切都运行良好,如果我只想在两个插入都被提交的情况下提交动作,我该怎么办...如果第一次插入顺利且我不想要的话我怎么能回滚空档案.... 我的问题是,一旦第一次插入被提交,假设在下一次插入时出现了问题 - 我将数据提供给一个表...任何想法?
答案 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
}