[Laravel]toSql()で出力したSQLログのプレースホルダーを埋める

PHP

Eloquentで生成されたクエリを確認する

開発中に「ここで実行されているSQLを確認したいな」と思うことがありますよね

そういう時は

$eloquent->toSql();

が使えます。
単純な例を出すと、

User::where('user_id', 'A')->get(); 

のような実装で、クエリを確認したければ

User::where('user_id', 'A')->toSql();

とすればいいわけです

ただ、実際にログに出力されたSQLを確認すると

select user_id, user_name from users where user_id = ? 

これだと、プレースホルダに何が入るのか、自分で確認しなければなりません

バインドされる値を取得する

プレースホルダーにバインドされる値は

$eloquent->getBindings();

で取得できます
配列形式でバインド値が取れるのでなかなかに便利です

例えば、

User::where('tall', '>', 150)->where('age', '>', 10)->get();

のようなクエリであれば

[150, 10]

が取得できるわけです。

クエリにパラメータをセットしたい

クエリとパラメータを個々に取得する方法はわかりましたが
手動でSQLを整形していくとなると、クエリが大きくなるにつれて
確認に要する時間が肥大化していきます

こういう単純な作業はプログラムにやらせましょう

プレースホルダーは「?」で統一されていますし
パラメータは配列で取得できます
それならfor文で置換できそうですよね

paiza.ioで手軽にプログラムが組める&シェアもしやすいので、使ってみてください
入力の1行目にクエリ
改行して2行目にパラメータをカンマ(,)区切りで張り付けて
実行ボタンを押せば置換後のクエリがコンソールに表示されます

Online editor and compiler
Paiza.IO is online editor and compiler. Java, Ruby, Python, PHP, Perl, Swift, JavaScript... You can use for learning pro...

ログの取り方

上記ツールを使う為に、クエリとパラメータを取得する必要があります

use Log;

Log::debug($query->toSql(), $query->getBindings());

を使うと、laravel.logにクエリとパラメータがセットで出力されます
これを先ほどのプログラムに入力してもらえば使えます。

楽をしながら正確に

どうせ同じことをやるなら、自分の作業負荷を下げて、尚且つ正確に進めたいですよね

今回ご紹介した置換プログラムはものすごく単純ですので、
パラメータの中にカンマが含まれたりするとバグります

その辺りはカスタマイズして使ってもらえればと思います
少しでもお役に立てれば幸いです