Codeigniter - Batch Update with Multiple Where Conditions

前端 未结 3 643
无人及你
无人及你 2020-12-11 01:30

For starters, the Codeigniter documentation on update_batch does not exist. kenjis was kind enough to provide some documentation and submit it to the repository. Hopefully t

3条回答
  •  离开以前
    2020-12-11 01:32

    I am using codeigniter 3.1.5 and had the same problem, but I solved my problem as follows:

    $data = array(
        array(
            'title' => 'My title' ,
            'name' => 'My Name 2' ,
            'date' => 'My date 2'
        ),
        array(
            'title' => 'Another title' ,
            'name' => 'Another Name 2' ,
            'date' => 'Another date 2'
        )
    );
    
    $this->db->where('name','My Name 2');
    $this->db->update_batch('mytable', $data, 'title');
    

    Produces it:

    // Produces:
    // UPDATE `mytable`
    // SET `name` = CASE
    //     WHEN `title` = 'Another title' THEN 'Another Name 2'
    //     WHEN `title` = 'My title' THEN 'My Name 2'
    //     ELSE `name`
    // END,
    //     `date` = CASE 
    //     WHEN `title` = 'My title' THEN 'My date 2'
    //     WHEN `title` = 'Another title' THEN 'Another date 2'
    //     ELSE `date`
    // END
    //     WHERE `title` IN ('My title','Another title')
    // AND `name` = 'My Name 2'
    

    UPDATE

    I had a problem trying to add more than 100 records with update_batch, for example:

    $data = [1=>a,2=>b ... 200=>zz];
    

    First call (with WHERE):

    // Produces:
    // UPDATE `mytable`
    // SET `name` = CASE
    //    WHEN `title` = 'My title' THEN 'My Name 2'
    //    WHEN `title` = 'Another title' THEN 'Another Name 2'
    //    ELSE `name`
    // END,
    //  `date` = CASE 
    //    WHEN `title` = 'My title' THEN 'My date 2'
    //    WHEN `title` = 'Another title' THEN 'Another date 2'
    //    ELSE `date`
    // END
    //    WHERE `title` IN ('My title','Another title')
    //    AND `name` = 'My Name 2'
    

    Second call on (Without WHERE):

    // Produces:
    // UPDATE `mytable`
    // SET `name` = CASE
    //      WHEN `title` = 'My title' THEN 'My Name 2'
    //      WHEN `title` = 'Another title' THEN 'Another Name 2'
    //      ELSE `name`
    // END,
    //      `date` = CASE 
    //      WHEN `title` = 'My title' THEN 'My date 2'
    //      WHEN `title` = 'Another title' THEN 'Another date 2'
    //      ELSE `date`
    // END
    //      WHERE `title` IN ('My title','Another title')
    

    Try this:

    $chunk1 = array_chunk($data,100);
    for($i=0;$i < count($chunk1);$i++) {
       $this->upload_model->update_data($chunk1[$i],'My Name 2');
    }
    

    Model:

    public function update_data($data='',$name=''){
       $this->db->where('name',$name);
       $this->db->update_batch('mytable', $data, 'title');
    }
    

提交回复
热议问题