CakePHPで複雑なSQLを使おうとすると、findだけでは厳しい場合もあります。
そんなときは独自のSQLを使うと良いでしょう。
独自のSQLを使ったときに、CakePHPのfindとは違った配列が出来上がるので、CakePHPのfindの出力と出力されるデータを合わせる技も紹介します。
書式
書式は簡単で、queryメソッドの中にSQL文を直接記載します。
書式
$this->Model->query(“SELECT * FROM table_name”,$cachequeries = false);
第二引数にfalseを入力するとキャッシュしないようになります。
利用例
基本形
PHP
$this->Post->query("SELECT * FROM posts LIMIT 2;");
出力結果
Array ( [0] => Array ( [posts] => Array ( [id] => 1 [user_id] => 7 ) ) [1] => Array ( [posts] => Array ( [id] => 3 [user_id] => 9 ) ) )
出力結果をCakePHPのfind型に変更(応用)
CakePHPの規約に沿ってテーブルを作成するとテーブル名はpostsという複数形、Modelで使うときはPostというキャメル記法になります。
独自のSQLを使うと、出力した配列の配列名がPostではなくpostsになってしまい、システムにPostとpostsが混在して使いにくくなってしまいます。
以下のようにすることにより出力される配列の形を統一することができます。
PHP
$this->Post->query("SELECT * FROM posts as Post LIMIT 2;");
出力結果
Array ( [0] => Array ( [Post] => Array ( [id] => 1 [user_id] => 7 ) ) [1] => Array ( [Post] => Array ( [id] => 3 [user_id] => 9 ) ) )
利用の注意
1.CakePHPの$Model->cacheQueriesは無視されます。クエリの実行をキャッシュしないようにするには第二引数にfalseを入力。例:$this->Model->query($query, $cachequeries = false)
2.query()はCakePHPと分離された機能なので、サニタイズはしっかり行いましょう。
3.XSSやSQLインジェクション対策のため、プリペアドステートメントを使うのが良いでしょう。
[参考]