0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Laravelでバインドパラメータ込みのSQL文を確認する方法

Posted at

開発中にデバッグなどで実際に実行される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"

やっていること

  1. Eloquentモデルでクエリを作成し、get()などで値を取得する前に変数へ代入
  2. クエリビルダのgetBindings()でバインドされたパラメータの配列を取得
  3. クエリビルダのtoSql()でクエリの文字列を取得
  4. 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リファレンスにも記載あり。

サクッと確認したい時に便利なので嬉しいですね。

参考記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?