I have MySQL table containing as serials(start,end,quantity,status)
.
start-start serial,end-end serial, quantity- difference between start and end, and status is 'R' or 'P'. Suppose I have supplied user 1-1000 R serials, user then enter multiple entries between 1-1000.
I am getting array of serials(sorted) from user as
$arr=array(
array(
'start'=>201,
'end'=>300,
'quantity'=>100),
array(
'start'=>401,
'end'=>600,
'quantity'=>200),
array(
'start'=>701,
'end'=>850,
'quantity'=>150)
)
I want the to insert records in table as
(start,end,quantity,status)
(1,200,200,R)
(201,300,100,P)
(301,400,100,R)
(401,600,200,P)
(601,700,100,R)
(701,850,150,P)
(851,1000,150,R)
What I have tried will only insert 1st and last record of R and all P records but not in between records of R
$this->db->where("md5(serial_id)",$serial_id);
$dd2=$this->db->get("serial")->row_array();
$arr=array(
"start"=>$dd['start_serial_no'],
"end"=>$ins_arr[0]['start_serial_no']-1,
'quantity'=>$ins_arr[0]['start_serial_no']-$dd['start_serial_no'],
'status'=>'R',
);
$this->db->insert('serial',$arr);
for($i=0;$i<count($ins_arr);$i++)
{
$arr=array(
"start_serial_no"=>$dd['start_serial_no'],
"end_serial_no"=>$ins_arr[0]['start_serial_no']-1,
'quantity'=>$ins_arr[0]['start_serial_no']-$dd['start_serial_no'],
'status'=>'P',
);
$this->db->insert('serial',$arr);
}
$arr=array(
"start_serial_no"=>$ins_arr[$i-1]['start_serial_no'],
"end_serial_no"=>$dd['end_serial_no'],
'quantity'=>$ins_arr[$i-1]['start_serial_no']-$dd['start_serial_no'],
'status'=>'R',
);
$this->db->insert('serial',$arr);
you need to modify it as follows.
$this->db->where("md5(serial_id)",$serial_id);
$dd2=$this->db->get("serial")->row_array();
$arr=array(
"start"=>$dd['start_serial_no'],
"end"=>$ins_arr[0]['start_serial_no']-1,
'quantity'=>$ins_arr[0] ['start_serial_no']-$dd['start_serial_no'],
'status'=>'R',
);
$this->db->insert('serial',$arr);
for($i=0;$i<count($ins_arr);$i++)
{
$p_arr=array(
"start_serial_no"=>$dd['start_serial_no'],
"end_serial_no"=>$ins_arr[0]['start_serial_no']-1,
'quantity'=>$ins_arr[0]['start_serial_no']-$dd['start_serial_no'],
'status'=>'P',
);
$this->db->insert('serial',$p_arr);
$r_arr=array(
"start_serial_no"=>$p_arr['start_serial_no'] + $p_arr['quantity'] ,
"end_serial_no"=>$p_arr['start_serial_no'] + $p_arr['quantity'] + 100,
'quantity'=> 100,
'status'=>'R',
);
$this->db->insert('serial',$r_arr);
}
$arr=array(
"start_serial_no"=>$ins_arr[$i-1]['start_serial_no'],
"end_serial_no"=>$dd['end_serial_no'],
'quantity'=>$ins_arr[$i-1]['start_serial_no']-$dd['start_serial_no'],
'status'=>'R',
);
$this->db->insert('serial',$arr);
$this->db->insert_batch();
batch insert can be used to insert array that you listed in your question.you can find tutorial here.
https://ellislab.com/codeigniter/user-guide/database/active_record.html
Tough I am accepting shanusingh answer.I did some modifications to that. Answering for anybody else have same issue
$this->db->where("md5(serial_id)",$serial_id);
$dd=$this->db->get("serial")->row_array();
$arr=array(
"start_serial_no"=>$dd['start_serial_no'],
"end_serial_no"=>$ins_arr[0]['start_serial_no']-1,
'quantity'=>$ins_arr[0]['start_serial_no']-$dd['start_serial_no'],
'status'=>'R',
);
$this->db->insert('serial',$arr);
for($i=0;$i<count($ins_arr);$i++)
{
$p_arr=array(
"start_serial_no"=>$ins_arr[$i]['start_serial_no'],
"end_serial_no"=>$ins_arr[$i]['end_serial_no'],
'quantity'=>$ins_arr[$i]['end_serial_no']-$ins_arr[$i]['start_serial_no']+1,
'status'=>'P',
);
$this->db->insert('serial',$p_arr);
if($i!=count($ins_arr)-1)
{
$r_arr=array(
"start_serial_no"=>$p_arr['end_serial_no']+1,
"end_serial_no"=>$ins_arr[$i+1]['start_serial_no']-1,
'quantity'=> $ins_arr[$i+1]['start_serial_no']-$p_arr['end_serial_no']-1,
'status'=>'R',
);
$this->db->insert('serial',$r_arr);
}
}
$arr=array(
"start_serial_no"=>$ins_arr[$i-1]['end_serial_no'],
"end_serial_no"=>$dd['end_serial_no'],
'quantity'=>$dd['end_serial_no']-$ins_arr[$i-1]['end_serial_no']+1,
'status'=>'R',
);
$this->db->insert('serial',$arr);