Laravelでは、クエリビルダーやEloquentを使ってデータベースにアクセスする際、
toSql()メソッドを利用することでSQL文を取得することができます。
しかしながら、toSql()で取得したSQL文はプレースホルダーが含まれており、
そのままでは実際の値がどのようになるかわかりません。
そこで、この記事では、LaravelでtoSql()で出力したSQLログのプレースホルダーを埋める方法を紹介します。
preg_replace_arrayとarray_mapを使ったプレースホルダーの置換
以下のメソッドを使用することで、LaravelのtoSql()で出力したSQLログのプレースホルダーを埋めることができます。
public function brackets($n) {
return "'".$n."'";
}
$sql = preg_replace_array('/\?/', array_map([$this, 'brackets'], $query->getBindings()), $query->toSql());
このコードでは、preg_replace_array関数とarray_map関数を組み合わせて、プレースホルダーに対応する値を置換しています。
brackets関数の実装
brackets関数は、SQL文のプレースホルダーに対応する値を正しくクォートし、安全な形で埋め込むための関数です。以下に実装例を示します。
public function brackets($n) {
return "'".$n."'";
}
使用例
use Illuminate\Support\Facades\DB;
public function index()
{
$query = \DB::table('users')
->where('name', '=', 'John')
->orWhere('age', '>', 25);
$sql = preg_replace_array('/\?/', array_map([$this, 'brackets'], $query->getBindings()), $query->toSql());
dd($sql);
}
public function brackets($n) {
return "'".$n."'";
}
このコードを実行すると、以下のような結果が得られます。
select * from `users` where `name` = 'John' or `age` > 25
このように、LaravelでtoSql()で出力したSQLログのプレースホルダーを埋める方法を使用すれば、プレースホルダーに対応する値を正しくクォートし、安全な形で埋め込むことができます。これにより、デバッグ時やログの解析などで、実際に実行されるSQL文を確認しやすくなります。