📌  相关文章
📜  laravel eloquent 获取生成的 sql (1)

📅  最后修改于: 2023-12-03 15:02:34.882000             🧑  作者: Mango

Laravel Eloquent 获取生成的 SQL

在 Laravel 开发中, 数据库查询是非常常见的操作。Eloquent ORM 是 Laravel 中的一种操作数据库的方式, 极大地方便了我们的操作。不过,有时候我们需要获取 Eloquent ORM 生成的 SQL,用于调试或分析查询性能等目的。本文将介绍如何在 Laravel 中获取 Eloquent ORM 生成的 SQL。

方案一:使用 toSql 方法

我们可以使用 toSql 方法来获取 Eloquent ORM 生成的 SQL。例如,我们查询 users 表中的所有数据

$users = User::all();

我们可以选择将查询变量打印出来,像下面这样:

$users = User::all();
dd($users->toSql());

当我们在浏览器中运行该代码时,我们将看到 Eloquent ORM 生成的 SQL 代码。

select * from `users`

同样,我们可以将查询的 list 方法加到上面的查询中:

$users = User::where('age', '>', 18)->orderBy('age', 'desc')->get();
dd($users->toSql());

我们看到的 SQL 语句就是这样的:

select * from `users` where `age` > ? order by `age` desc
方案二:使用 DB facade

除了使用 toSql 方法之外,我们还可以使用 Laravel 中 DB facade 的 select 方法。这种方法需要我们手动开启一次查询记录日志,可以在搜索类和 model 查询时使用。

我们可以在 .env 文件中加入

DB_QUERY_LOG=true

这样就开启了查询记录日志。在开始查询之前,我们需要用下面的方法手动开启一次查询记录:

DB::connection()->enableQueryLog();

然后开始查询操作,将查询结果打印出来:

$users = User::where('age', '>', 18)->orderBy('age', 'desc')->get();
dd(DB::getQueryLog());

我们可以看到查询记录日志结果如下:

array:1 [
  0 => array:3 [
    "query" => "select * from `users` where `age` > ? order by `age` desc"
    "bindings" => array:1 [
      0 => 18
    ]
    "time" => 0.78
  ]
]
方案三: 使用 Listen 查询事件

除了前两种方法之外,还有监听查询事件的方法。我们可以使用 listen 方法,监听查询事件,获取生成的 SQL 代码。

例如,我们查询 users 表中的所有数据,我们可以在 AppServiceProvider 的 boot 方法中添加监听:

use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Support\Facades\Log;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        DB::listen(function (QueryExecuted $event) {
            Log::info("Generated SQL: " . $event->sql . ' [' . implode(', ', $event->bindings) . ']');
        });
    }
}

然后,我们可以开始查询操作,就能够在 Laravel 日志中看到 Eloquent ORM 生成的 SQL 代码了。我们可以进入 /storage/logs/laravel.log 文件中查看代码,将生成的 SQL 代码复制粘贴。

总结

以上是在 Laravel 中获取 Eloquent ORM 生成的 SQL 的三种方法。分别是使用 toSql 方法、使用 DB facade、使用 Listen 查询事件。在实际使用中,根据具体情况选择适合自己的方法即可。如果您有其他更好的方式来获取 Eloquent ORM 生成的 SQL,请在评论区中分享给其他开发者。