CakePHPでSQLやXMLなどを外だしにする方法

こんにちは!ぐちです。

CakePHPでSQLなどをヒアドキュメントで書くとソースコードが汚くなり見にくくなりますよね。そんなときにSQL文を外だしにしてパラメータを渡して動的に変更できる方法がありましたのでご紹介します。

LibertyBehavior

kozoさんがGithubへ公開してくださっているBehaviorを使えば超簡単に実現することができます!

以下のディレクトリに対象のファイルを格納します。
/app/Model/Behavior/LibertyBehavior.php

SQLを記述したファイルを下記へ格納します。
/app/Views/Elements/test.sql

SELECT * FROM hogeTbl WHERE id = <?php echo $id; ?>

<?php ?>内の処理は呼び出す際にパラメータをバインドすることができます。変数名は任意のもので問題ありません。

Modelで以下のように書きます。

<?php
    class Hoge extends AppModel {
        var $name = 'Hoge';
        var $actsAs = array('Liberty');

        public function test(){
            $param = array(
                'id' => 5
            );

            $sql = $this->getElementString('test', $param, '.sql');
            $rows = $this->query($sql);

            return $rows;
        }
    }
?>
  • $actsAsは使用するBehaviorをクラス名から”Behavior”を除いた名前をarray()で指定します。
  • $paramはSQL文中に記述したパラメータ名にバインドしたい値を連想配列で指定します。
  • getElementStringの第1引数はElementsに格納したファイルの拡張子の除いた名前を指定します。
  • getElementStringの第2引数はSQL文中にバインドするパラメータを指定します。
  • getElementStringの第3引数はElementsに格納したファイルの拡張子を指定します。
  • getElementStringの返却値はSQLファイルに記述した内容がバインド値に置き換わった後の文字列ですのでそのままクエリを発行すれば実行されます。

世の中本当に便利なものを作成して頂いている方がいらっしゃいますね!感謝です。kozoさんありがとうございます!!