Как разделить входящие строки данных для выполнения update_batch () и insert_batch () CodeIgniter? - PullRequest
0 голосов
/ 30 мая 2020

Моя цель - использовать комбинацию 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
    )
)

Моя структура таблицы выглядит так:

enter image description here

1 Ответ

1 голос
/ 31 мая 2020
  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, если ваша бизнес-логика c требует, чтобы значения sr_no были уникальными, я рекомендую вам отразить это в конфигурации вашей таблицы, установив столбец sr_no как уникальный ключ.

...