简单实现Laravel获取当前执行的SQL
其实在执行代码的同时看一看当前的SQL是一个好习惯,一方面可以检查一下代码的错误,另一方面可以检查一下模型关联是否因为没有使用
with而导致多次查询。
新建一个文件 app\Listeners\QueryListener.php
<?php
namespace App\Listeners;
use Illuminate\Database\Events\QueryExecuted;
class QueryListener
{
public function handle(QueryExecuted $event)
{
$sql = str_replace("?", "'%s'", $event->sql);
try {
$log = vsprintf($sql, $event->bindings);
} catch (\Exception $e) {
$log = $sql;
}
$file = storage_path('logs/'.date('Ymd').'_sql.txt');
file_put_contents($file, $log.PHP_EOL, FILE_APPEND);
}
}
修改 app/Providers/EventServiceProvider.php
protected $listen = [
'Illuminate\Database\Events\QueryExecuted' => [
'App\Listeners\QueryListener'
]
];
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
$sql = str_replace(“?”, “‘%s’”, $event->sql);
还是习惯用
确实有一些SQL处理之后会出现一些问题,99%以上的SQL是正常的吧,只是方便开发的时候查看是否会出现循环查询,或者查询出错了看一下where条件是否正确,或者其他一些方面的时候比较方便。
clockwork 不香嘛?
为了查看调试的SQL, 我特意做了一个包 composer require yangjisen/laravel-executed
telescopeovertrue/laravel-query-logger
才是最简单的 👍