CodeIgniter一个查询多个语句

时间:2018-06-11 11:56:04

标签: php mysql codeigniter

我使用CodeIgniter,当insert_batch没有完全工作时(插入的项目数量与给定的项目数量不同),我必须再次执行插入操作,使用insert ignore来最大化插入的数量通过这个过程,没有现有的错误。 当我使用这种方法时,我插入的数据类型不需要严格遵守给定的项目数和数据库中的数字。最大化是方式。

a)正确的方法a)尽可能多地使用insert_batch b)何时失败,使用解决方法,同时尽量减少不必要的请求数量?

由于

2 个答案:

答案 0 :(得分:0)

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);
}

修改

插入批处理already splits the batches

,您"number of items inserted different from the number of items given"的原因可能是因为达到了允许的内存大小。这件事发生在我身上太多次了。

答案 1 :(得分:0)

使用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];
}