Codeigniter 从Cpdeigniter中的CSV更新多个表
我正在分析一个CSV文件,以便向表中添加recrods。我就是这样做的Codeigniter 从Cpdeigniter中的CSV更新多个表,codeigniter,csv,Codeigniter,Csv,我正在分析一个CSV文件,以便向表中添加recrods。我就是这样做的 foreach($csvData as $key => $row) { $data_n[$key] = array( 'mf_date' => $row['mf_date'], 'mf_work_id' => $row['mf_work_id'], 'mf_sender' => $r
foreach($csvData as $key => $row) {
$data_n[$key] = array(
'mf_date' => $row['mf_date'],
'mf_work_id' => $row['mf_work_id'],
'mf_sender' => $row['mf_sender'],
'mf_amount' => $row['mf_amount'],
'mf_trx_id' => $row['mf_trx_id'],
);
$this->db->insert('monthly_fee', $data_n[$key]);
}
我有另一个名为monthly_due的表,其中有三列
1)md_work_id
2)md_ue
3)md_paid
我想用这个操作更新该表的两列。其中mf\U work\U id与要更新为的md\U work\U id匹配
$md_due = $md_due - $row['mf_amount'];
md_paid = $md_paid + $row['mf_amount'];
我该怎么做呢?希望这有帮助
foreach($csvData as $key => $row) {
$data_n[$key] = array(
'mf_date' => $row['mf_date'],
'mf_work_id' => $row['mf_work_id'],
'mf_sender' => $row['mf_sender'],
'mf_amount' => $row['mf_amount'],
'mf_trx_id' => $row['mf_trx_id'],
);
if($this->db->insert('monthly_fee', $data_n[$key]))
{
$md_due = $md_due - $row['mf_amount'];
$md_paid = $md_paid + $row['mf_amount'];
$this->db->query("UPDATE monthly_due SET md_due='$md_due',md_paid='$md_paid' WHERE md_work_id = '$row['mf_work_id']'");
}
}
首先,我假设您正在应用程序的模型中工作。我假设您希望在安全模式下实现它,我的意思是,只有当两个查询都成功插入+更新,并且完全确保如果由于数据库问题而没有执行更新,则会回滚插入,并且不会插入任何数据 好的,最安全的方法是使用事务:考虑到数据库的表支持事务(假设MySQL RMDB上的innodb表),应该这样做:
foreach($csvData as $key => $row) {
$this->db->trans_start();
$data_n[$key] = array(
'mf_date' => $row['mf_date'],
'mf_work_id' => $row['mf_work_id'],
'mf_sender' => $row['mf_sender'],
'mf_amount' => $row['mf_amount'],
'mf_trx_id' => $row['mf_trx_id'],
);
$this->db->insert('monthly_fee', $data_n[$key]);
// Now, you should check in the Database for the data
$updData = array(
'md_due' => 'md_due + ' . $row['mf_amount']
, 'md_paid' => 'md_paid + ' . $row['mf_amount'] )
$this->db->query("
UPDATE monthly_due
SET md_due = md_due - $row['mf_amount']
, md_paid = md_paid + $row['mf_amount']
WHERE md_work_id = $row['mf_work_id']
");
$this->db->trans_complete();
}
如果不需要事务或表不支持事务,则不必使用$this->db->trans_*函数
最后,代码中唯一的修改是添加更新语句,在SQL中,它的数字只是用来替换PHP值的:
UPDATE monthly_due
SET md_due = md_due - 23
, md_paid = md_paid + 23
WHERE md_work_id = 45
对于带有活动记录的Codeigniter,上面的句子应该是这样的。我应该如何将查询放入循环中?假设我使用循环导入了10个数据,其中4个与“每月到期日”表匹配。所以我必须把这个查询放在一个循环中。相同的循环还是另一个循环?如何在该循环中传递获取的md_due md_payed md_?查询已放入该循环中。我在下面写它只是为了展示如何直接对数据库执行它以进行测试。关于您的CSV,您将有4个匹配项,因为您将在更新中找到带有WHERE子句的行。如果你没有它,你不会更新任何东西。