猿问

如何划分要由 CodeIgniter 的 update_batch() 和 insert_batch

我的目标是使用 CodeIgniter 的组合insert_batch()并将update_batch()传入数据添加到我的macro_plan表中。


在我下面的脚本中,我试图根据sr_no值查询数据库中的现有行,然后适当地调用批量查询方法。


function insert_batch($dataSet)

{

    $query = $this->db->query("select sr_no from macro_plan");

    $data = $query->result_array();

    $sr_nos=array();


    foreach($data as $key => $value):

        $sr_nos[$key]=$value['sr_no'];

    endforeach;


    $query1= $this->db->query("select * from macro_plan WHERE sr_no IN ('".$sr_nos."')");

    $update_query = $query1->result();

    if ($update_query->num_rows() > 0) {


        $this->db->update_batch($dataSet,$this->macro_plan);//update if ids exist

    } else {

        $this->db->insert_batch($dataSet,$this->macro_plan);//insert if does not exist

    }

}

但是,我收到“数组到字符串转换”错误。


$dataset将类似于:


Array (

    [0] => Array (

        [quantity_update] => 88

        [sr_no] => 2020-11-1

        [batch] => Batch 2

        [quantity_date_update] => 05-May-20

        [inq_id] => 49

    )

    [1] => Array (

        [quantity_update] => 99

        [sr_no] => 2020-11-2

        [batch] => Batch 1

        [quantity_date_update] => 11-May-20

        [inq_id] => 49

    )

)

我的表结构如下所示:

忽然笑
浏览 115回答 1
1回答

慕丝7291255

在您的表中查询包含sr_no您的$dataSet.然后将键应用于值中的结果集行sr_no——这允许根据旧数据快速查找新数据(以查看是否应插入相应的新行、作为更新执行或完全忽略,因为数据是相同的。未经测试的建议:function insertUpdateMacroPlan($dataSet){    $keyedExistingRows = array_column(        $this->db            ->where_in('sr_no', array_column($dataSet, 'sr_no'))            ->get('macro_plan')            ->result_array(),        null,        'sr_no'    );    foreach ($dataSet as $data) {        if (isset($keyedExistingRows[$data['sr_no']])) {            // sr_no exists in the db, add known id to new data array            $identified = ['id' => $keyedExistingRows[$data['sr_no']]['id']] + $data;            if ($identified != $keyedExistingRows[$data['sr_no']]) {                $updateBatch[] = $identified;            }            // if the arrays contain the same data, the new data will be discarded        } else {            $insertBatch[] = $data;        }    }    if (!empty($insertBatch)) {        $this->db->insert_batch('macro_plan', $insertBatch);    }    if (!empty($updateBatch)) {        $this->db->update_batch('macro_plan', $updateBatch, 'id');    }}ps 如果您的业务逻辑要求sr_no值是唯一的,我建议您通过将sr_no列设置为唯一键来反映在您的表配置中。
随时随地看视频慕课网APP
我要回答