2012-03-05 13 views
7

Estoy usando codeigniter update_batch función.puedo agregar array a where cláusula para update_batch en codeigniter

Quiero pasar una matriz como el tercer parámetro (cláusula where) al 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' 
    ) 
); 

lugar de esto:

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

Quiero hacer esto:

$this->db->update_batch('mytable', $data, array('title','name')); 

Así múltiple, donde añaden condiciones.

¿Esto es posible?

+2

creo que la mejor opción sería para sobrescribir la función update_batch con la tuya. Esta funcionalidad no existe en la función. – Brendan

+2

Espero que el equipo de CodeIgniter cree un método de inserción/actualización multibatch para el marco. Para mí, el método de actualización por lotes para 1 índice es 1600% más rápido que actualizar la base de datos línea por línea. – machineaddict

Respuesta

-3

Siempre se puede hacer esto:

$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); 

No se ha probado.

ACTUALIZACIÓN Esta carece de la where parámetro requerido en update_batch().

+2

Esto no funciona –

0

Usted puede hacer esto mediante la creación de su método de actualización por lotes en su modelo Test_model por ejemplo, porque CodeIgniter no es compatible con múltiples donde la condición de update_batch nativa, por lo que el siguiente ejemplo:

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); 
} 
Cuestiones relacionadas