Cakephp3 Controllerでインサートする

Cakephp3にて、コントローラで簡易的なインサートする時の処理がたくさんあったので、使い方とその特徴をまとめてみました。
ちなみに、Cakephp3のバージョンは3.6

bin/cake version
3.6.14

DB構成はざっくりと下記
id: AUTO_INCREMENT : プライマリーキー
content_id:smallint : コンテンツID
type: varchar(32) : タイプ
modified: datetime : 更新日時
created: datetime : 作成日時

Entityクラスを用いたインサート&アップデート

newEntityメソッドでインスタンス生成し1件づつアップロードする処理です。

$content_lists = TableRegistry::getTableLocator()->get('content_lists');
$content = $content_lists->newEntity();

$content->content_id = '478';
$content->type = 'adan';

if ($content_lists->save($content)) {
// 成功したら、インサートされたコンテンツのidを使用する事ができる
$id = $content->id;
}

複数行インサートする場合は、下記

$data = [
['content_id' => '478', 'type' => 'yonaha1'],
['content_id' => '479', 'type' => 'yonaha2'],
];
$articles = TableRegistry::getTableLocator()->get('content_lists');
$entities = $articles->newEntities($data);
$result = $articles->saveMany($entities);
非推奨メソッドに注意

cakephp3.6 以降で、
TableRegistry::get(‘テーブル名’) が非推奨に…
そして、
TableRegistry::getTableLocator()->get(‘テーブル名’);
が正式な記述になりました。

複数行が得意!クエリービルダーを使ってインサート&アップデート

こちらは、複数行インサート時に、values()メソッドを複数行指定することで対応できます。
上記で述べた、「Entityクラスを用いたインサート&アップデート」の方法でも、
複数行のINSERTは可能ですが、毎回INSERTのクエリが発行されてしまうので、
下記のクエリビルダーだと一発でINSERTクエリが実行されます。

$date_ymd = date('Y-m-d h:m:s');
$content_lists = TableRegistry::getTableLocator()->get('content_lists');
$query = $content_lists->query();
$ret = $query->insert(['content_id', 'type_a','type_b'])
->values([
'content_id' => '478',
'type' => 'adan',
'created' => $date_ymd,
'modified' => $date_ymd
])
->values([
'content_id' => '478',
'type' => 'adan',
'created' => $date_ymd,
'modified' => $date_ymd
])
->execute();
日時更新に気をつけろ

クエリービルダーを使うと、
「作成日時(created)」と「更新日時(modified)」が自動更新されないので、
クエリ作成時に指定してあげましょう。


プロに聞いてみる
株式会社adanはエンジニアのキャリアに真剣に向き合っています。
企業の情報エンジニアとしてのキャリアアップの方法、現在の待遇(給料・報酬)未経験からのステップアップ方法などのご相談を受け付けています。
お気軽にお問合せください。