今まではサブクエリを使うときは、sqlを直書きしていたのですが、where句が動的に変わったりするとやっぱりめんどくさかったりするのでcakephp2の機能を利用してサブクエリを発行してみました。
この記事では以下のことを紹介しています。
・Cakephp2でサブクエリを使う方法
・サブクエリで生成されたテーブルをジョインする方法
CakePHP2でサブクエリを使ってジョイン(join)するコードを解説します
早速ですがコードを紹介していきます。
cakephp2系ではbuildStatementを使えばサブクエリを使ったコードが実現できるようです。
使用するコード
コードは以下のとおりです。
条件や抽出したいカラム、テーブル名は各自で好きなものにしてみてください。
// データソースを定義
$db = $this->Model->getDataSource();
// サブクエリの条件(この辺はお好きにどうぞ)
$subQueryCondition = ['Sub1.column =' => $変数とか固定値とか];
//サブクエリ
$subQuery = $db->buildStatement(['fields' => ['Sub1.id','Sub1.testcolumn','COUNT(Sub1.id) as count'], 'table' => 'サブクエリで使いたいテーブル名', 'alias' => 'Sub1', 'conditions' => $subQueryCondition, 'group' => ['Sub1.to_id','Sub1.testcolumn'],], $this->Model);
//join
$joins = [['type' => 'LEFT', 'table' => 'ジョインしたいテーブル', 'alias' => 'YourTable1', 'conditions' => ['YourTable1.to_id = Model.id']], ['type' => 'LEFT', 'table' => '(' . $subQuery . ')', 'alias' => 'Sub', 'conditions' => ['Sub.test_id = Model._id']]];
//発行するSQLの条件
$conditions = ['Model.id' => $変数とか固定値とか];
//SQL実行
$result = $this->Model->find('all', ['fields' => '*', 'conditions' => $conditions, 'order' => ['Model.created DESC'], 'joins' => $joins]);
知っておけば結構役に立つかもしれない
仕事ではどうしても古いシステムを触らないといけないときもあります。
今、cakephp2系を使っている方は参考にしてみてください。
データベースが絡んだ処理でサブクエリを使う機会はちょいちょいあるので役に立つかと思います。
CakePHP2でサブクエリを使う方法【番外編】
上記のやり方以外にもCakePHP2でサブクエリを使ったSQLを利用することができます。
ここではもう1つの方法を解説していきます。
query()の使用
CakePHP2でサブクエリを使うもう1つの方法がqueryを使うことです。
コードは次のような感じになります。
$sql = "SELECT *
FROM
(
SELECT
*
FROM
sub_table
WHERE
yourcondition
) AS sub
GROUP BY
columun";
$data = $this->query($sql);
where句が動的に変わらない場合や、シンプルなSQLの場合はquery()メソッドを使ったほうがいいかと思います。
コードを見る側にとっても読みやすいですしね。
場合によって使い分けよう
プレースホルダの処理がごちゃごちゃしそうな場合はcakephp2の機能を利用してサブクエリを使う、そうでない場合はqueryを使うなど、目的や状況によって使い分けるといいかと思います。
両方使えるようになっておくことで実装の幅も広がるはずです。
今回は以上です。