Codeigniter 从Cpdeigniter中的CSV更新多个表

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

我正在分析一个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' => $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子句的行。如果你没有它,你不会更新任何东西。