Laravel 是一个基于 PHP 语言的开发框架,使用了 Active Record 风格的 ORM 数据库模型。这个模型为日常的业务开发提供了人性化的数据库操作体验。但带来的问题是当想要了解某个查询具体执行的 SQL 语句时,在还不熟悉框架的前提下会觉得有点茫然。
以我的了解,在 Laravel 中要获取模型查询的 SQL 语句至少有三种方法。
第一种、直接使用 toSql()
方法。来看看这个例子:
$sql = User::where('name', 'tom')->toSql();
var_dump($sql);
第二种、通过 DB
对象的 listen
方法。举例如下:
DB::listen(function ($query) {
var_dump($query->sql, $query->bindings);
});
User::where('name', 'tom')->get();
这种方法只需要定义一次,后续所有查询都会按照 listen
中的闭包方法定义来输出 SQL 信息。把 var_dump
方法换成日志输出,还可以方便的使用到线上环境来排查数据库查询问题。
第三种、同样由 DB
对象提供。先看例子:
DB::enableQueryLog();
User::where('realname', 'tom')->get();
$sql = DB::getQueryLog();
var_dump($sql);
这个方法先使用 DB::enableQueryLog()
开启日志查询记录功能,然后通过 DB::getQueryLog()
来获取 SQL 查询信息。
这三种获取 SQL 原始查询信息的方式各不相同,toSQL()
方式适合快速了解单条模型查询语句;listen()
适合整个请求周期下的大批量查询情况的调研;至于 enableQueryLog()
,因为默认返回的信息数据比较全面,适合开发时对复杂模型关系的确认或检查。