具有多种功能的Codeigniter事务

时间:2017-06-21 12:52:21

标签: php mysql codeigniter transactions codeigniter-3

我需要在“产品”表中添加产品,然后获取添加的产品ID,然后在“产品详细信息”表中添加该产品的详细信息

在Codeigniter的官方页面中,他们展示了如何执行此操作但不使用功能,例如:

$this->db->trans_start(TRUE); // Query will be rolled back
$this->db->query('AN SQL QUERY...');
$this->db->trans_complete();

我需要使用函数并仍然保持完整性,如果两个查询中的一个失败然后没有添加记录,我准备了以下代码,我想知道如果以这种方式Codeigniter将能够检测是否查询失败或不撤消记录或者是否有其他最佳实践或其他方法。

  

而不是使用$ this-> db->查询('AN SQL QUERY ...');我正在使用   功能:

public function init_product()
{
    $this->db->trans_begin();
    $this->new_product();
    $this->new_product_details();

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

添加产品并返回聚合产品ID

public function new_product()
{      
    $data = array(            
        'name' => $this->input->post('name'),
        'details' => $this->input->post('details'),
        'price' => $this->input->post('price')
    );
    $this->db->insert('products', $data);
    if($this->db->affected_rows()) {            
        return $this->db->insert_id();
    }
    return false;
}
  

添加产品详细信息

public function new_product_details()
{      
    $data = array(            
        'product_id' => $this->new_product(),
        'user_id' => $this->session->id_user
    );
    $this->db->insert('products', $data);
    if($this->db->affected_rows()) {            
        return true;
    }
    return false;
}

正如您指定的那样,我需要知道这种方式是否有用,即使我不遵循Codeigniter中的示例,并且如果使用这些函数,Codeigniter可以检测数据库中的查询或插入是否失败,如果他们可以给我一些更好的例子。

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

你为什么要这样做?不行。我看到你使用相同的表,所以为什么不在初始函数中执行此操作并在需要时返回插入ID,如下所示:

public function init_product()
{
    $this->db->trans_begin();

    $data = array(            
        'name' => $this->input->post('name'),
        'details' => $this->input->post('details'),
        'price' => $this->input->post('price'),
        'user_id' => $this->session->id_user
    );

    $this->db->insert('products', $data);

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

    return $this->db->insert_id();
}