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に任せてよいところだと思う。 手動で行うととにかくソースが見づらくなるので。
 フレームワークを多用するとプログラム能力が落ちるという意見もあるが、開発で使わざるを得ないなら最大限使い倒そう。