Codeigniter update_batch () с включенным обновлением ключа where

Я хочу обновить несколько строк в базе данных с помощью update_batch() codeigniters update_batch() .
Но поле, указанное в том же месте, также должно быть изменено.

Следующий код должен прояснить:

 $set = array( array( 'token' => '65787131678754', 'device' => 'none', 'new_token_value' => '' ), array( 'token' => '75798451315464', 'device' => 'none', 'new_token_value' => '' ) ); $this->db->update_batch(TBL_NAME, $set, 'token'); 

Токены, указанные в token должны быть обновлены с помощью device до 'none' а сам token должен быть установлен в пустую строку '' .

Возможно ли это с update_batch() функции update_batch() ?


В sql я бы написал что-то вроде

 UPDATE TBL_NAME SET token='', device='none' WHERE token='65787131678754' 

для одного обновления, но это нецелесообразно для нескольких, поэтому я хочу использовать update_batch() .

Я создал вспомогательную функцию, в основном идентичную функции codeigniter batch_update() .
Но с возможностью обновления самого индекса. Новое значение определяется index_update_key .

 function update_batch($db, $table = '', $set = NULL, $index = NULL, $index_update_key = '') { if ($table === '' || is_null($set) || is_null($index) || !is_array($set)) { return FALSE; } $sql = 'UPDATE ' . $db->protect_identifiers($table) . ' SET '; $ids = $when = array(); $cases = ''; //generate the WHEN statements from the set array foreach ($set as $key => $val) { $ids[] = $val[$index]; foreach (array_keys($val) as $field) { if ($field != $index && $field != $index_update_key) { $when[$field][] = 'WHEN ' . $db->protect_identifiers($index) . ' = ' . $db->escape($val[$index]) . ' THEN ' . $db->escape($val[$field]); } elseif ($field == $index) { //if index should also be updated use the new value specified by index_update_key $when[$field][] = 'WHEN ' . $db->protect_identifiers($index) . ' = ' . $db->escape($val[$index]) . ' THEN ' . $db->escape($val[$index_update_key]); } } } //generate the case statements with the keys and values from the when array foreach ($when as $k => $v) { $cases .= "\n" . $db->protect_identifiers($k) . ' = CASE ' . "\n"; foreach ($v as $row) { $cases .= $row . "\n"; } $cases .= 'ELSE ' . $k . ' END, '; } $sql .= substr($cases, 0, -2) . "\n"; //remove the comma of the last case $sql .= ' WHERE ' . $index . ' IN (' . implode(',', $ids) . ')'; return $db->query($sql); } 

Теперь я могу сделать следующее

 $set = array( array( 'token' => '657871316787544', 'device' => 'none', 'new_token_value' => '' ), array( 'token' => '757984513154644', 'device' => 'none', 'new_token_value' => '' ) ); update_batch($this->db, 'table_name', $set, 'token', 'new_token_value'); 

и вывод sql

 UPDATE `b2c` SET `token` = CASE WHEN `token` = '657871316787544' THEN '' WHEN `token` = '757984513154644' THEN '' ELSE token END, `device` = CASE WHEN `token` = '657871316787544' THEN 'none' WHEN `token` = '757984513154644' THEN 'none' ELSE device END WHERE token IN (657871316787544,757984513154644) 
 $this->db->where('option1', $option1);<br/> $this->db->update_batch('table_name', $data, 'option2');