[CakePHP] 独自のSQL文を利用する方法

CakePHPで複雑なSQLを使おうとすると、findだけでは厳しい場合もあります。
そんなときは独自のSQLを使うと良いでしょう。
独自のSQLを使ったときに、CakePHPのfindとは違った配列が出来上がるので、CakePHPのfindの出力と出力されるデータを合わせる技も紹介します。
書式
書式は簡単で、queryメソッドの中にSQL文を直接記載します。
第二引数にfalseを入力するとキャッシュしないようになります。
利用例
基本形
1 |
$this->Post->query("SELECT * FROM posts LIMIT 2;"); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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が混在して使いにくくなってしまいます。
以下のようにすることにより出力される配列の形を統一することができます。
1 |
$this->Post->query("SELECT * FROM posts as Post LIMIT 2;"); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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インジェクション対策のため、プリペアドステートメントを使うのが良いでしょう。
関連記事
- [CakePHP] 独自のSQL文でプリペアドステートメントを使う方法
- [MySQL]1カラムに登録されたカンマ区切りデータを検索・抽出する方法(FIND_IN_SET)
- [CakePHP] 独自SQLのAS句で新しいフィールドを作りCakePHPの形式でデータを出力する方法
- [CakePHP] find(all)でIN句を使ってデータを抽出する方法
- [CakePHP] 別モデルでページネーションを(pagination)行う方法