DB::expr()万能すぎワロタ

FuelPHP Advent Calendar 2012に登録しました。
まだ何を書こうか決めてませんけど…。
それにしても、去年の自分には想像出来なかったな、とちょっと感慨深いカンジです。


今回はFuelPHPのクエリビルダのお話です。

これまで、ややこしいクエリ書こうと思ったら最後、DB::query()で処理するしかないと思い込んでました。
そうすると当然ながら後からWHERE条件を足そうと思うと面倒なわけで。

もしかして?と思ってクエリビルダ内でところどころDB::expr()を呼ぶように書いてみたら、案外うまく行ってしまいました。
やってみるもんですね…


今回書いたクエリは以下の通りです。
ある親テーブルの情報+そこにぶら下がっている削除されていない子データの件数を取得するクエリですね。

$groups = \DB::select('t0.id', 't0.order', 't0.name', 'CASE WHEN t1."count" IS NULL THEN 0 ELSE "t1"."count" END as "count"')
->from(array('hoge_groups', 't0'))
->join(\DB::expr(
'(SELECT `in_t1`.`group_id`, SUM(CASE `in_t1`.`delete_flag` WHEN 0 THEN 1 ELSE 0 END) as count' // 削除されていないデータのみカウントする
.' FROM `hoges` AS `in_t1`'
.' GROUP BY `in_t1`.`group_id`) as `t1`'
), 'left outer')
->on('t0.id', '=', 't1.group_id')
->where(
array( array('t0.delete_flag', '=', '0') )
)->order_by('t0.order')->order_by('t0.id')
->execute()->as_array();
このうち、
'CASE WHEN t1."count" IS NULL THEN 0 ELSE t1."count" END as "count"'
の箇所はid:Kenji_sさんの記事「FuelPHP の Query Builder でよくある誤解」を参考にさせていただいています。いつもありがとうございます。



…さて。
ここまで書いてから再確認した所、以下でも問題なく動作しました。
まさかタイトル詐欺のオチがつくとは…

$groups = \DB::select('t0.id', 't0.order', 't0.name', 'CASE WHEN t1."count" IS NULL THEN 0 ELSE "t1"."count" END as "count"')
->from(array('hoge_groups', 't0'))
->join('(SELECT "in_t1"."group_id", SUM(CASE "in_t1"."delete_flag" WHEN 0 THEN 1 ELSE 0 END) as "count"'
.' FROM "experiences" AS "in_t1"'
.' GROUP BY "in_t1"."group_id") as "t1"'
, 'left outer')
->on('t0.id', '=', 't1.group_id')
->where(
array( array('t0.delete_flag', '=', '0') )
)->order_by('t0.order')->order_by('t0.id')
->execute()->as_array();