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

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文を確認しやすくなります。

コメントを残す

入力エリアすべてが必須項目です。メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。