レコード数が多いテーブルの検索や複雑な抽出条件による検索を実行するケースにおいて発行されるSQLによってパフォーマンスに影響が出てきます。
今回はEloquentの裏でどのようなSQLが発行されているかを取得する方法について解説します。
Contents
SQL文の取得方法
toSql()メソッドを用いることでプリペアードステートメントの形実行前のSQLを取得できます。
//取得
$sql = Author::where('name','=','著者A')->toSql();
echo $sql;
//結果
select * from `authors` where `name` = ?
実際に実行されたSQLの確認方法
getQueryLogメソッドを使うことでそのリクエスト内で実行された全てのSQLを所得することが可能です。
//SQL保存を有効化する
DB::enableQueryLog();
//データの操作実行
$authors = Author::find([1,3,5]);
//クエリの取得
$queries = DB::getQueryLog();
//SQL保存を無効化
DB::disableQueryLog();
//取得したクエリの表示
dd($queries);
//結果
array:1 [▼
0 => array:3 [▼
"query" => "select * from `authors` where `authors`.`id` in (?, ?, ?)"
"bindings" => array:3 [▼
0 => 1
1 => 3
2 => 5
]
"time" => 6.84
]
]
findメソッドはIN句に変換されているので検索対象のテーブルのレコード数によってはパフォーマンスに影響がでそうです。
まとめ
処理内容によってはクエリビルダやベーシックなど別のデータアクセスの機能も組み合わせながらより適切な処理を実装していくといいです。
LaravelのEloquentでSQLを確認する方法は以上となります。