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',
)
)
)
これはかなり便利。