LoginSignup
12
14

More than 5 years have passed since last update.

Laravel 4のDBのクエリログを淡々と流す

Last updated at Posted at 2014-12-09

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使うなどして減らすといいですね。

12
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
14