Codeigniter - 具有多个Where条件的批量更新

zec*_*hdc 15 activerecord codeigniter codeigniter-2

首先,update_batch上的Codeigniter文档不存在.kenjis非常友好地提供一些文档并将其提交到存储库.希望他们很快就拉下来.

有谁知道如何在Codeigniters update_batch命令中添加多个条件?

我想要的用途:

$where = array(
    'title',
    'name'
); 

$this->db->update_batch('mytable', $data, $where);
Run Code Online (Sandbox Code Playgroud)

当我尝试这段代码时,我得到了以下错误:

A Database Error Occurred
One or more rows submitted for batch updating is missing the specified index.

Filename: C:\wamp\www\wheel\system\database\DB_active_rec.php

Line Number: 1451
Run Code Online (Sandbox Code Playgroud)

由kenjis更新批处理文档:

$this->db->update_batch();
Run Code Online (Sandbox Code Playgroud)

根据您提供的数据生成更新字符串,然后运行查询.您可以将数组对象传递给函数.以下是使用数组的示例:

$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->update_batch('mytable', $data, 'title');
// 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')
Run Code Online (Sandbox Code Playgroud)

第一个参数将包含表名,第二个参数是值的关联数组,第三个参数是where键.

资料来源:

Chr*_*itz 18

您不能添加多个where子句update_batch().它只接受一个字符串作为where子句的第三个参数,所以我确信没有办法按照当前编写方法的方式执行此操作.

来源:

/**
 * Update_Batch
 *
 * Compiles an update string and runs the query
 *
 * @param   string  the table to retrieve the results from
 * @param   array   an associative array of update values
 * @param   string  the where key
 * @return  object
 */
public function update_batch($table = '', $set = NULL, $index = NULL)
Run Code Online (Sandbox Code Playgroud)

  • 糟糕,最后有一个第四个参数是一个很好的补充.如果使用直接SQL,则可以在UPDATE查询的末尾添加"AND".这似乎给出了预期的效果,例如:`UPDATE mytable SET ... WHERE id IN(1,2,3)AND mycategory = 44` (3认同)

Rod*_*zim 10

我使用codeigniter 3.1.5并遇到了同样的问题,但我解决了我的问题如下:

$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');
Run Code Online (Sandbox Code Playgroud)

产生它:

// 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'
Run Code Online (Sandbox Code Playgroud)

UPDATE

尝试使用update_batch添加超过100条记录时遇到问题,例如:

$data = [1=>a,2=>b ... 200=>zz];
Run Code Online (Sandbox Code Playgroud)

第一次调用(使用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'
Run Code Online (Sandbox Code Playgroud)

第二次调用(没有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')
Run Code Online (Sandbox Code Playgroud)

试试这个:

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

模型:

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

  • 请记住,我的第二个索引是静态值 (2认同)