使用CodeIgniter进行多模型功能的单笔交易

mah*_*shb 5 transactions model codeigniter

如果在我要回滚已提交查询的任何表中出现任何错误时,我都需要插入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
   }
Run Code Online (Sandbox Code Playgroud)

这很完美。但是我认为在控制器内部编写查询不是一个好习惯。因此,我做到了这一点,称为模型函数,并在相应的模型函数中编写了这些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`
} 
Run Code Online (Sandbox Code Playgroud)

但这没有按预期工作

Tpo*_*jka 5

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

因此,请在模型中进行以下查询:

// 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);
}
Run Code Online (Sandbox Code Playgroud)