OR Mapperを使っているとどうしても実際に吐いているクエリが見えづらくなって、非効率になっても気づかないので、クエリログを淡々と流そうとした。
そのものズバリの答えが俺たちのStackOverflowにあったので、参考にさせていただく。
Laravel 4 - logging SQL queries
以下の様にイベントに反応すれば良い模様。このコードのよい所はdatabaseのconfigで切り替えられるようにしてあるところ。localの場合のみ出力するとかにしておけば、ローカル環境だけでテストできる。
if (Config::get('database.log', false))
{
Event::listen('illuminate.query', function($query, $bindings, $time, $name)
{
$data = compact('bindings', 'time', 'name');
// Format binding data for sql insertion
foreach ($bindings as $i => $binding)
{
if ($binding instanceof \DateTime)
{
$bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
}
else if (is_string($binding))
{
$bindings[$i] = "'$binding'";
}
}
// Insert bindings into query
$query = str_replace(array('%', '?'), array('%%', '%s'), $query);
$query = vsprintf($query, $bindings);
Log::info($query, $data);
});
}
上記StackOverflowでは、routes.php
に貼れよ的なことを書いてあるけれど、ルーティングのところにこれ貼るの気が引けるので、別途listners.php
見たいのを作ってapp/start/global.php
とかで読み込むようにするのがいいのかもしれない。
あとは、app/config/local/database.py
とかで、'log' => true
とか書いてあげればOK。
1回のアクセスに対して大量にクエリが発行れてたら、例えばeager loading使うなどして減らすといいですね。