FuelPHPのORMでMySQLの関数を使う際に、地味にはまったのでメモ。
ORMモデルの場合、
$result = Model_User::query()->select(DB::expr('COUNT(*) as cnt'))->from_cache(false)->get();
としてもうまく行かない。これはFuelPHPがORMモデルを呼び出した際に、カラム名の重複を防ぐために自動でas `t0_c0`といったように別名を付けるから。
これを避けるためにこう書くとうまく行く。
スポンサードリンク
$result = Model_User::query()->select(array(DB::expr('COUNT(*)'), 'cnt'))->from_cache(false)->get();
selectメソッドの引数にarrayを入れて、第一引数にDBクラスのexpr()でエスケープを防止したCOUNT関数を、第二引数に別名を渡す。
こうすることにより、’cnt’というカラム名でデータを扱えるようになる。
リレーション設定した別のテーブルのデータを扱う際には、キーとしたカラムもselectに含める。
ちなみにfrom_cache(false)を付けているのはこの記事の趣旨とは直接関係がないけど、この後の処理で再度Model_Userを呼び出す際に勝手にキャッシュを使われてえらいことになるのを防ぐため(←これもはまった…orz)。
ORMモデルでselect()を使う際には、おまじないとして私はfrom_cache(false)を付け加えているだけです。
コメント