開発中にデバッグなどで実際に実行されるSQL文を確認したい時があるので、メモ。
Laravel10以下の場合はgetBindings()
とtoSql()
// クエリを作成
$queryBuilder = XXXTable::where('client_id', $clientId)
->where('del_flag', 0)
->where('update_at', '>=', $dateFrom)
->orderBy('name');
// ddで確認
dd(preg_replace_array('/\?/', $queryBuilder->getBindings(), $queryBuilder->toSql()));
結果
"select * from `xxx_table` where `client_id` = 12345 and `del_flag` = 0 and `update_at` >= 2024-11-26 12:34:56 order by `name` asc"
やっていること
- Eloquentモデルでクエリを作成し、
get()
などで値を取得する前に変数へ代入 - クエリビルダの
getBindings()
でバインドされたパラメータの配列を取得 - クエリビルダの
toSql()
でクエリの文字列を取得 - 3で取得したクエリはパラメータが
?
になっているので、2で取得したパラメータに置換する
$queryBuilder->toSql()
の返却値
"select * from `xxx_table` where `client_id` = ? and `del_flag` = ? and `update_at` >= ? order by `name` asc"
$queryBuilder->getBindings()
の返却値
array:3 [▼
0 => 12345
1 => 0
2 => Carbon\Carbon ...(Carbonオブジェクトを渡している)
date: 2024-11-26 12:34:56.0 Asia/Tokyo (+09:00)
}
]
preg_replace_array()
はLaravelのヘルパー関数
preg_replace_array関数は、指定パターンを順番に配列中の値に置き換えます。
PHP標準関数のpreg_replace()
でも置換できなくはないですが、preg_replace_array()
の方が簡潔に書けて便利。
Laravel10以上の場合はtoRawSql()
なお、Laravel10以上の場合はtoRawSql()
一発で書けるそうです。
XXXTable::where('client_id', $clientId)
->where('del_flag', 0)
->where('update_at', '>=', $dateFrom)
->orderBy('name')
->toRawSql();
LaravelのAPIリファレンスにも記載あり。
サクッと確認したい時に便利なので嬉しいですね。
参考記事