AppModelに下記独自関数を定義する。
App::uses('Sanitize', 'Utility'); class AppModel extends Model { public function saveAllAtOnce($data) { if(count($data) > 0 && !empty($data[0])) { $data = Sanitize::clean($data); $value_array = array(); $fields = array_keys($data[0][$this->name]); foreach ($data as $key => $value) { $value_array[] = "('" . implode('\',\'', $value[$this->name]) . "')"; } $sql = "INSERT INTO " . $this->table . " (" . implode(', ', $fields) . ") VALUES " . implode(',', $value_array); $this->query($sql); return true; } return false; } }
この関数に下記のような構造のデータを渡せば、一度のインサート文で複数レコードを一括登録してくれるのでsaveAll()メソッドを使うよりも処理が速くなる。
array( 0 => array( 'ModelName' => array( 'Field1' => 'value', 'Field2' => 'value', 'Field3' => 'value', 'Field4' => 'value', ) ), 1 => array( 'ModelName' => array( 'Field1' => 'value', 'Field2' => 'value', 'Field3' => 'value', 'Field4' => 'value', ) ) )
これはかなり便利。