2012-03-05 6 views
7

codeigniter update_batch関数を使用しています。codeigniterのupdate_batchにwhere句に配列を追加できますか?

配列を3番目のパラメータ(where句)として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, array('title','name')); 

だから、複数:

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

私はこれをしたいです。

これは可能ですか?

+2

独自のupdate_batch関数を上書きします。この機能は機能にはありません。 – Brendan

+2

私は、CodeIgniterチームがフレームワーク用のマルチバイト挿入/更新メソッドを作成することを願っています。私の場合、1インデックスの更新バッチ方式は1600%高速で、1行ずつデータベースを更新します。 – machineaddict

答えて

-3

あなたは、常にこの操作を行うことができます:

$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_batch()に必要なwhereパラメータを欠いています。

+2

これは動作しません –

0

以下の例ようCodeIgniterのは、ネイティブupdate_batchで複数のWHERE条件をサポートしていませんので、あなたは、例えば、モデルTest_modelでバッチ更新のためのあなたの方法を作成することによってこれを行うことができます:私はあなたの最善の策はなると思い

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); 
} 
関連する問題