CakePHP 複数のデータベース更新処理を1つの処理で行う

データベースに対して複数の処理したいことがあると思います。データベースの更新を一つずつ順に行っていくことを考えると 一時的にデータベースとして不整合な状態になるため、これらの更新は一度に処理したいところです。そこで、トランザクションによる解決法が考えられます

トランザクションとはデータベースに対して行われる1つ以上の更新処理を1つの処理としてまとめてデータベースに反映させること 

です。以下にCakePHPによるその一番かんたんなサンプルコードを示します。コントローラーでトランザクションを使うためにはConnectionManagerをuseする必要があります

<?php

namespace App\Controller;

use App\Controller\AppController;
use Cake\Datasource\ConnectionManager;

class HogeController extends AppController
{
  public function index()
  {
    $connection = ConnectionManager::get('default');
    // トランザクション開始
    $connection->begin();
    try {

      // 行いたい処理

      // コミット
      $connection->commit();

    } catch(\Exception $e) {
      // 例外に対する処理

      // ロールバック
      $connection->rollback();
    }
  }
}

begin() でトランザクションを開始してデータを更新する際には commit() します。なんらかのエラーなどによって更新を取り消したい場合は rollback() することでデータは更新されることなくトランザクションを終了します。  get(‘default’) の default というのは、 cakephp/config/app.php で設定されている Datasources プロパティの default 部分になります。get(‘default’) とすることで app.php で設定されたデータベースに対してトランザクションを行うことができます