CodeIgniter один запрос нескольких операторов - PullRequest
0 голосов
/ 11 июня 2018

Я использую CodeIgniter, и когда insert_batch не работает полностью (количество вставленных элементов отличается от количества предоставленных элементов), я должен снова выполнить вставки, используя игнорирование вставки, чтобы максимизировать число, проходящее черезпроцесс без ошибок для существующих.Когда я использую этот метод, вид данных, которые я вставляю, не нуждается в строгом соответствии между количеством предоставленных предметов и количеством, помещенным в базу данных.Максимизировать - это путь.

Каков будет правильный способ: а) максимально использовать insert_batch б) в случае сбоя, использовать обходной путь и минимизировать количество ненужных запросов?

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Правильный способ вставки данных с использованием insert_batch:

CI_Controller:

public function add_monthly_record()
{
    $date               = $this->input->post('date');
    $due_date           = $this->input->post('due_date');
    $billing_date       = $this->input->post('billing_date');
    $total_area         = $this->input->post('total_area');
    $comp_id            = $this->input->post('comp_id');
    $unit_id            = $this->input->post('unit_id');
    $percent            = $this->input->post('percent');
    $unit_consumed      = $this->input->post('unit_consumed');
    $per_unit           = $this->input->post('per_unit');
    $actual_amount      = $this->input->post('actual_amount');
    $subsidies_from_itb = $this->input->post('subsidies_from_itb');
    $subsidies          = $this->input->post('subsidies');

    $data = array();
    foreach ($unit_id as $id => $name) {
      $data[] = array(
                    'date'               => $date,
                    'comp_id'            => $comp_id,
                    'due_date'           => $due_date,
                    'billing_date'       => $billing_date,
                    'total_area'         => $total_area,
                    'unit_id'            => $unit_id[$id],
                    'percent'            =>$percent[$id],
                    'unit_consumed'      => $unit_consumed[$id],
                    'per_unit'           => $per_unit[$id],
                    'actual_amount'      => $actual_amount[$id],
                    'subsidies_from_itb' => $subsidies_from_itb[$id],
                    'subsidies'          => $subsidies[$id],
                ); 
    };


    $result = $this->Companies_records->add_monthly_record($data);

    //return from model
    $total_affected_rows = $result[1];
    $first_insert_id = $result[0];

   //using last id 
    if ($total_affected_rows) {
        $count = $total_affected_rows - 1;
        for ($x = 0; $x <= $count; $x++) {
            $id = $first_insert_id + $x;
            $invoice = 'EBR' . date('m') . '/' . date('y') . '/' . str_pad($id, 6, '0', STR_PAD_LEFT);
            $field = array(
                'invoice_no' => $invoice,
            );
            $this->Companies_records->add_monthly_record_update($field,$id);
        }
    }
    echo json_encode($result); 
}

CI_Model:

public function add_monthly_record($data)
{
    $this->db->insert_batch('monthly_record', $data);
     $first_insert_id = $this->db->insert_id();
     $total_affected_rows = $this->db->affected_rows();
    return [$first_insert_id, $total_affected_rows];
}
0 голосов
/ 11 июня 2018

AS @ q81 упомянуто, вы могли бы разделить пакеты (по вашему усмотрению или в зависимости от системных ресурсов) следующим образом:

$insert_batch = array();
$maximum_items = 100;

$i = 1;
while ($condition == true) {
    // code to add data into $insert_batch
    // ...

    // insert the batch every n items
    if ($i == $maximum_items) {
        $this->db->insert_batch('table', $insert_batch); // insert the batch
        $insert_batch = array(); // empty batch array
        $i = 0;
    }
    $i++;
}

// the last $insert_batch
if ($insert_batch) {
    $this->db->insert_batch('table', $insert_batch);
}

Редактировать:

в то время как вставка пакета уже разделяет пакеты , причина, по которой у вас есть "number of items inserted different from the number of items given", может заключаться в том, что достигнут допустимый объем памяти.это случалось со мной слишком много раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...