No.470
【CakePHP】バルクインサートを安全に行う
生SQLを直書きするのに不安のある貴方へ
生SQLで書くととにかく解りづらくなりがちな、INSERT文の項目と値の関係が解りやすいのが良い。
Query Builder > Inserting Data
Query
オブジェクトの insert()
メソッドでカラム定義、 values()
メソッドで登録する値を指定する。
実際には下記のように記載する。
bulk insertするデータの数だけ values()
メソッドを繰り返すのがポイント。
use Cake\ORM\TableRegistry;
$table = TableRegistry::getTableLocator()->get('テーブル名');
$query = $table->query();
$query->insert(['カラム1', 'カラム2', ...])
->values([
'カラム1' => 'A1',
'カラム2' => 'A2'
...
])
->values([
'カラム1' => 'B1',
'カラム2' => 'B2'
...
])
->execute();
これにより下記のSQLが実行される。
INSERT INTO テーブル名 ('カラム1','カラム2') VALUES ('A1','A2'),('B1','B2')...;
この方法最大の利点は、サニタイズだけでなく、文字列の囲み処理もCakePHPに任せてよいところだと思う。 手動で行うととにかくソースが見づらくなるので。
フレームワークを多用するとプログラム能力が落ちるという意見もあるが、開発で使わざるを得ないなら最大限使い倒そう。