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() ; ?>