在Codeigniter中从CSV更新多个表

时间:2014-08-21 05:30:25

标签: 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' => $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_work_id与md_work_id匹配想要更新为

$md_due = $md_due - $row['mf_amount'];
md_paid = $md_paid + $row['mf_amount'];

我该怎么做?

2 个答案:

答案 0 :(得分:1)

首先,我想你正在使用你的应用程序模型。我想你想要以安全模式实现它,我的意思是,只有当两个查询都成功插入+更新,并且完全确定如果由于数据库问题而没有执行更新,那么你的插入就会被滚动返回,没有插入数据。

嗯,最安全的方法是使用事务:考虑到数据库的表支持事务(假设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应该是上面写的句子。

答案 1 :(得分:-1)

希望这有帮助

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']'");


                   }
            }