スポンサーリンク

CakePHP3のORMで,生のSQLを実行したり変数値をバインドする方法のテンプレート

毎回コピペが面倒なのでここにまとめます。

変数値のバインドをしない場合

<?php

use Cake\Datasource\ConnectionManager;


      // SQL組み立て
      $sql = <<< EOSQL

~SQLを書く~

EOSQL;

      // SQL実行
      $connection = ConnectionManager::get('default');
      $results = $connection->execute( $sql )->fetchAll('assoc');

?>

変数値をバインドする場合

SQL内で不明の値は「?」と書く。

<?php

use Cake\Datasource\ConnectionManager;


      // SQL組み立て
      $sql = <<<EOSQL

~SQLを書く~
  WHERE
    val1 = ?

EOSQL;

        // SQLバインド
        $conn = ConnectionManager::get('default');
        $statement_obj = $conn->prepare($sql);
        $statement_obj->bind( 
          [ "バインドしたい値" ], // 値
          [ "string" ] // 変数型
        );

        // SQLをdebug
        //return [[$statement_obj->queryString, ""]];
        
        // SQL実行
        $statement_obj->execute();
        $rows = $statement_obj->fetchAll('assoc');

?>

CakePHP3のORMで,トランザクションとコミット・ロールバックの書き方のテンプレート

DBへの更新処理をひとまとめにして,
エラー発生時に全体を更新前の状態に戻すために
トランザクションが必要。

PHPコード

<?php

use Cake\Datasource\ConnectionManager;



// トランザクション
$connection = ConnectionManager::get('default');
$connection->begin();
try {

  // ロールバックのテスト
  //throw new \Exception("ロールバックのテスト");

  // 更新処理
  // ~

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

}
catch(\Exception $e)
{
  debug( "ロールバックします。" );
  $connection->rollback();
  
  // 例外を投げる
  throw $e;
}


?>

CakePHP3のORMで,テーブルをJOINするPHPコード(SQLを書かずにLEFT JOIN)

CakePHPのORMでJOIN。

CakePHPのバージョンは3.7.9で,CentOSのVPS上で使っている。

PHPコード

Hogeモデルでfindする際に,Fugaモデルの情報をくっつけたい場合。

<?php

$query = $this
  ->find()

  // fugaをhogeにJOINする
  ->join([
    "table" => "fugas",
    "alias" => "f",
    "type"  => "LEFT",
    "conditions" => "f.hoge_id = Hoge.id"
  ])
  
  // カラムを選ぶ
  ->select([
    "id"        => "Hoge.id",
    "hoge_prop" => "Hoge.prop",

    "fuga_prop" => "f.prop"
  ])

  // 表示順序
  ->order([ "f.prop" => "ASC" ] )

  ->all()
;

?>