为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
忽然笑 2023-04-21 16:34:26
我的目标是使用 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    ))我的表结构如下所示:
查看完整描述

1 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

  1. 在您的表中查询包含sr_no您的$dataSet.

  2. 然后将键应用于值中的结果集行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列设置为唯一键来反映在您的表配置中。


查看完整回答
反对 回复 2023-04-21
  • 1 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信