Codeigniter - Пакетное обновление с несколькими условиями, где - PullRequest
13 голосов
/ 15 сентября 2011

Для начала, документации Codeigniter на update_batch не существует.Кенджис был достаточно любезен, чтобы предоставить некоторую документацию и отправить ее в хранилище.Надеюсь, они скоро это сделают.

Кто-нибудь знает, как добавить кратные условия для команды Codeigniters update_batch?

Мое желаемое использование:

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

$this->db->update_batch('mytable', $data, $where);

Когда я попробовал этот кодЯ получил следующую ошибку:

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

Обновление пакетной документации от kenjis:

$this->db->update_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');
// 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')

Первый параметр будет содержать имя таблицы, второй - ассоциативный массив значений, третий параметр - ключ where.

Sources:

Ответы [ 2 ]

18 голосов
/ 15 сентября 2011

Вы не можете добавить несколько предложений 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)
8 голосов
/ 10 июня 2016

Я использую 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');

Производит его:

// 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'

ОБНОВЛЕНИЕ

У меня возникла проблема при попытке добавить более 100 записей с помощью update_batch, например:

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

Первый вызов (с 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'

Второй вызов (без 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')

Попробуйте:

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

Модель:

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