【CakePHP2.4】saveAll()メソッドでINSERT文を分割させたくない場合。

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',
		)
	)	
)

これはかなり便利。