2017年10月19日木曜日

Laravel5.5で、SQLクエリログを記録するミドルウェア

Laravel5.5で、SQLクエリログを記録するミドルウェアです。 enableQueryLog()getQueryLog()メソッドの応用ですね。atuwebさんのブログを参考にさせてもらいました。ミドルウェアの動きもよく理解できます。素晴らしい。

/app/Http/Middleware/QueryLog.php(非常に簡易的なもの)
namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\DB;

class QueryLog
{
  /**
   * Handle an incoming request.
   *
   * @param  \Illuminate\Http\Request  $request
   * @param  \Closure  $next
   * @return mixed
   */
  public function handle($request, Closure $next)
  {
    $this->readyOutputSqlLog();

    $response = $next($request);

    $this->outputSqlLog();

    return $response;
  }

  private function readyOutputSqlLog()
  {
    DB::enableQueryLog();
  }

  private function outputSqlLog()
  {
    $query = DB::getQueryLog();

    print "<pre>" ;
    print_r($query) ;
    print "</pre>" ;
  }
}


参考サイト
[Laravel]SQLをログ出力するミドルウェアつくったった(atuwebさん)
LaravelでSQL実行ログを出力するミドルウェア(GitHub)
Laravel5.5で、EloquentのSQLを確認するtoSql()とgetBindings()のメソッド
Laravel5.5で、EloquentのSQLを確認する(その2)

2017年10月18日水曜日

Laravel5.5で、EloquentのSQLを確認する(その2)

Laravel5.5で、EloquentのSQLを確認する(その2)です。DB::enableQueryLog()で、ログ取得の準備。DB::getQueryLog()で、ログを取得すれば良いらしい。こちらの方が、時間も表示されるので良いかもしれません。

// ログ取得の準備
DB::enableQueryLog();

// Eloquent
$blog = Blog::published()->get();

// ログ取得&出力
$query = DB::getQueryLog();
dd($query);

実際に出力されるSQLとバインド変数の数値
array:1 [
  0 => array:3 [
    "query" => "select * from `blogs` where `blogs`.`published` = ?"
    "bindings" => array:1 [
      0 => 1
    ]
    "time" => 12.34
  ]
]

参考サイト
How to get last executed query in Larave 5?(itsolutionstuff)
php Laravelで実行されたSQLを取得する方法(プログラマーの雑記さん)
Laravel5.5で、EloquentのSQLを確認するtoSql()とgetBindings()のメソッド

2017年10月17日火曜日

Laravel5.5で、EloquentのSQLを確認するtoSql()とgetBindings()のメソッド

Laravel5.5で、EloquentのSQLを確認するtoSql()getBindings()のメソッドです。toSql()で、SQLが確認できて、getBindings()で、バインド変数の実際の数値が確認できます。

// Eloquent
$blog = Blog::where('category', '=', 5)
            ->where('published_at', '>=', '2017-10-01');

// 出力
dd($blog->toSql(), $blog->getBindings());
実際に出力されるSQLとバインド変数の数値
"select * from `blogs` where `category` = ? and `published_at` >= ?"

array:2 [▼
  0 => 5
  1 => "2017-10-01"
]

参考サイト
Does Laravel's toSql() method mask ids? (column value being replaced by question mark)(Stack Overflow)
Laravel5でSQLを確認する(お手軽版)(Qiita)