こちらのサイトから引用させていただきました
http://damepg.hatenablog.com/entry/2012/10/01/001223
saveAllとqueryでのバルクインサートでは50倍の差があるみたいです。
バルクインサート
どのテーブルでも使えるので、AppModelにでも。
// バルクインサート
public function bulkInsert($data) {
$table_name = $this->usetable;
$fields = array_keys($data[0]);
$holder = '(' . implode(',', array_fill(0, count($fields), '?')) . ')';
$holders = implode(',', array_fill(0, count($data), $holder));
$params = array();
foreach ($data as $key => $val) {
foreach ($fields as $field) {
if ($field == 'created') {
$params[] = date('Y-m-d H:i:s');
} else {
$params[] = $val[$field];
}
}
}
$fields = implode(',', $fields);
$sql = "INSERT INTO ${table_name} (${fields}) VALUES ${holders}";
$ret = $this->query($sql, $params);
if ($ret === false) {
// エラー処理
return false;
}
if ($this->getAffectedRows() != count($data)) {
// エラー処理
return false;
}
return true;
}
使い方
// Model指定して使う
$this->User->bulkInsert(
array(
array( 'name' => 'taro','job' => '社長'),
array( 'name' => 'jiro','job' => '専務'),
array( 'name' => 'saburo','job' => 'バイト'),
)
);