Я хочу обновить несколько строк в базе данных с помощью 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');