Fuelphpでデータベースの値を操作する場合は、DBクラスを使用します。
そのDBクラスを使用してデータを取得すると、自動でエスケープ処理をかけてくれます。
しかし、状況によってはエスケープしないでデータを取得したい場合があります。
「DB::expr()」メソッドを使用すればエスケープ処理しないで実行することができます。
MySQLの関数で「COUNT()」「SUM()」「RAND()」などを使用したい場合や
サブクエリを使用してデータ取得する場合などに非常に便利です。
下記に、Fuelphpの「DB::expr()」メソッドを使用してデータを取得した時の方法をメモします。
■ expr()メソッド
エスケープ処理をしないで実行することができます。
DB::expr('クエリ文字列')
■ 「DB::expr()」の実行例(MySQL関数を使用した場合)
・「COUNT()」関数を使用して行数を取得する場合
$query = \DB::select(\DB::expr('COUNT(*) AS cnt'))->from('user'); $result = $query->execute()->as_array();
【実行したSQL文】
SELECT COUNT(*) AS cnt FROM `user`
・「SUM()」関数を使用して合計値を取得する場合
$query = \DB::select(\DB::expr('SUM(point) AS total'))->from('user'); $result = $query->execute()->as_array();
【実行したSQL文】
SELECT SUM(point) AS total FROM `user`
・「RAND()」関数を使用してデータをランダムに取得する場合
$query = \DB::select()->from('user'); $query->order_by(\DB::expr('RAND()')); $result = $query->execute()->as_array();
【実行したSQL文】
SELECT * FROM `user` ORDER BY RAND()
「DB::expr()」を使用すると上記のようなMySQLの関数を使用することができます。
以前はデータを取得した後にPHPで件数や合計値などを計算してました。
「DB::expr()」を使用するとSQL側で計算等ができるのでとても便利です。
他にも複雑なSQL文を実行する時など色々な使い方ができそうです。
しかし、エスケープ処理がされないので入力した値などを使用してデータを処理する場合は注意です。
その際は「DB::escape()」メソッドでエスケープするなどの処理が必要になります。