zzxworld

Laravel 项目中获取数据库 SQL 查询信息的三种方式

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(),因为默认返回的信息数据比较全面,适合开发时对复杂模型关系的确认或检查。