Php 我可以将数组添加到where子句以更新codeigniter中的_批吗
我正在使用codeigniterPhp 我可以将数组添加到where子句以更新codeigniter中的_批吗,php,codeigniter,Php,Codeigniter,我正在使用codeigniterupdate\u batch功能 我想将数组作为第三个参数(where子句)传递给update\u batch $data = array( array( 'title' => 'My title' , 'name' => 'My Name 2' , 'date' => 'My date 2' ), array( 'title' => 'Another title' ,
update\u batch
功能
我想将数组作为第三个参数(where子句)传递给update\u batch
$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');
我想这样做:
$this->db->update_batch('mytable', $data, array('title','name'));
因此,增加了多个条件
这可能吗?您始终可以这样做:
$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(array('title' => 'title', 'name' => 'name'));
$this->db->update_batch('mytable', $data);
没有测试
UPDATE这缺少
UPDATE\u batch()
中所需的where
参数。您可以通过在模型测试\u模型中创建批更新方法来实现这一点,例如,因为Codeigniter在本机更新\u批中不支持多个where条件,因此下面的示例如下:
public function update_batch_custom($table_name, $data, $indexes) {
if (empty($data) || empty($indexes)){
return 'Data or indexes must not be empty';
}
$db = $this->load->database('test_db', TRUE);
$sql = 'UPDATE ' . $table_name . ' SET ' . "\n";
//columns on which is done actual update
$columns = [];
foreach ($data[0] as $key => $value) {
if (!in_array($key, $indexes)){
$columns[] = $key;
}
}
/*
* forming WHEN .. THEN sql parts and WHERE condition
*/
$parts = [];
$where = [];
foreach ($data as $row) {
foreach ($columns as $column) {
$sql_part = ' WHEN (';
foreach ($indexes as $index) {
$sql_part .= $index . '= \''.$row[$index] . '\' AND ';
$where[$index][] = $row[$index];
}
$sql_part = substr($sql_part, 0, -4);
$sql_part .= ') THEN \'' . $row[$column] . '\'';
$parts[$column][] = $sql_part;
}
}
/*
* connecting WHEN .. THEN parts for each column to be updated
*/
foreach ($columns as $column) {
$sql .= $column .'= CASE ';
foreach ($parts[$column] as $sql_part) {
$sql .= $sql_part;
}
$sql .= ' ELSE ' . $column . ' END,';
}
/*
* adding WHERE part
*/
$sql = substr($sql, 0, -1);
$sql .= ' WHERE ';
foreach ($indexes as $index) {
if ( count($where[$index]) > 0){
$unique_where = array_unique($where[$index]);
$sql .= $index . ' IN (\'' . join('\',\'', $unique_where) . '\') AND ';
}
}
$sql = substr($sql, 0, -4);
$sql .= ';';
return $db->query($sql);
}
此update_batch函数不允许使用WHERE参数,但您可以在调用该函数之前尝试将其拆分 试试这个:
$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');
控制器:
$chunk1 = array_chunk($data,100);
for($i=0;$i < count($chunk1);$i++) {
$this->upload_model->update_data($chunk1[$i],'My Name 2');
}
记住,我的WHERE参数是一个静态值。您可以使用以下代码更新数据:
$this->db->update("TableName",[dataarray],[where condition array]);
我认为你最好的选择是用你自己的更新批处理函数覆盖更新批处理函数。此功能在函数中不存在。我希望CodeIgniter团队将为框架创建一个多批插入/更新方法。对我来说,1索引的更新批处理方法比逐行更新数据库快1600%。
$this->db->update("TableName",[dataarray],[where condition array]);