方法一:

我们有时候想测试一段代码生产的 SQL 语句,比如: 我们想看 App\User::all(); 产生的 SQL 语句,我们简单在 routes.php 做个实验即可:

//app/Http/routes.php

Route::get('/test-sql', function() {

    DB::enableQueryLog();

    $user = App\User::all();

    return response()->json(DB::getQueryLog());
});

然后我们在浏览器打开 http://www.yousite.com/test-sql 即可看到 $user = User::all(); 所产生的 SQL 了。

[
{
query: "select * from `users` where `users`.`deleted_at` is null",
bindings: [ ],
time: 1.37
}
] 方法二: 在routes.php添加如下代码
Event::listen('illuminate.query', function($sql, $param) {
file_put_contents(public_path().'/sql.log',$sql.'['.print_r($param, 1).']'."\r\n",8);
//echo $sql . ", with[" . join(',', $param) ."]</br>";
}); 方法三:
调用vendor\laravel\framework\src\Illuminate\Database\Query的toSql方法:
$query->toSql();
方法四:
使用监听器

第一步:创建监听器

php artisan make:listener QueryListener --event=illuminate.query

生成文件于 app/Listeners/QueryListener.php

然后删除 app/Listeners/QueryListener.php 顶部的 use App\Events\illuminate.query;, 这是自动生成的。

第二步:注册事件

打开 app/Providers/EventServiceProvider.php,在 $listen 中添加 illuminate.query 事件的监听器为 QueryListener

protected $listen = [
'illuminate.query' => [
QueryListener::class,
],
];

当然在类前面你需要 use App\Listeners\QueryListener; 不然就报类不存在了。

第三步:添加逻辑

修改上面生成的文件,我们把 SQL 查询记录到日志里,所以编辑 handle 方法为:

    /**
* Handle the event.
*
* @param Events $event
* @return void
*/
public function handle($sql, $params)
{
if (env('APP_ENV', 'production') == 'local') {
foreach ($params as $index => $param) {
if ($param instanceof DateTime) {
$params[$index] = $param->format('Y-m-d H:i:s');
}
}
$sql = str_replace("?", "'%s'", $sql);
array_unshift($params, $sql);
Log::info(call_user_func_array('sprintf', $params));
}
}

上面我们用到了两个类:Log 与 DateTime, 别忘记引入它们。

解释一下上面的代码:

  1. illuminate.query 事件触发时的参数为两个:handle($sql, $params), SQL 预处理语句与查询参数值;
  2. 我们只在开发环境记录 SQL:env('APP_ENV', 'production') == 'local'
  3. 我们的参数里可能存在日期类型,所以直接记日志会报错,所以处理一下:$param instanceof DateTime

然后跑一下试试吧,应该在日志里就能看到:

[2015-07-10 02:45:39] local.INFO: update `tricks` set `view_cache` = "10", `updated_at` = "2015-07-10 02:45:39" where `id` = "2"


laravel 查看sql的更多相关文章

  1. laravel查看sql语句

    我自己是用第一种方法来调试的,第三种不行 不知道为啥 laravel查看sql语句 方法一: 我们有时候想测试一段代码生产的 SQL 语句,比如: 我们想看 App\User::all(); 产生的 ...

  2. laravel 查看SQL语句

    Route::get('/test-sql', function(){ DB::enableQueryLog(); $user = App\User::first(); return DB::getQ ...

  3. 查看 Laravel 的 SQL 语句的方法

    在使用 Laravel 的 Eloquent 进行数据查询的时候,很多小伙伴都想看到背后执行的 SQL 语句到底是什么样的,这小笔录就是解决这个小问题的: 在 Providers/AppService ...

  4. ORACLE查看SQL的执行次数/频率

    在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致.如果执行频繁的S ...

  5. 知方可补不足~sqlserver中使用sp_who查看sql的进程

    回到目录 在SQLSERVER中每个会话,即每个查询分析器窗口都会产生一个SQL进程,对于那些持续时间短的进程,它们转瞬即失,而对于持续时间比较长的,我们需要希望查看它的运行状态,就可以借助SQL提供 ...

  6. 查看SQL Server多实例的版本

    通过 select @@version 查看当前的 SQL Server 安装的版本: 结果返回的是 SQL Server 2008 R2 (SP1),可安装的明明是 SQL Server 2012  ...

  7. SQL Server:查看SQL日志文件大小命令:dbcc sqlperf(logspace)

      SQL Server:查看SQL日志文件大小命令:dbcc sqlperf(logspace) DBA 日常管理工作中,很重要一项工作就是监视数据库文件大小,及日志文件大小.如果你管理数据库的有很 ...

  8. 快速查看SQL Server 中各表的数据量以及占用空间大小

    快速查看SQL Server 中各表的数据量以及占用空间大小. CREATE TABLE #T (NAME nvarchar(100),ROWS char(20),reserved varchar(1 ...

  9. 查看SQL执行计划

    一用户进入某界面慢得要死,查看SQL执行计划如下(具体SQL语句就不完全公布了,截断的如下): call     count       cpu    elapsed       disk       ...

随机推荐

  1. linux命令中的head命令

    head命令和tail命令就像他的名字一样浅显易懂,它是用来显示开头或者结尾某个数量的文字区块,head用来显示档案的开头至标准输出当中,而tail想当然就是查看档案的结尾. 命令格式 head  [ ...

  2. sublime3 docblocker插件定制自己的注释,配置步骤

    DocBlockr很好用,不仅仅可以自动生成注释,还可以手动编辑注释的格式. 安装方法:   Cmd+Shift+P -> Install Package -> docblockr  wi ...

  3. ubuntu 12.04和Windows 7双系统的安装方法

    ubuntu是一个操作系统,和安卓一样同是linux内核下的子民,所以来这贡献一下,也求JW放出安卓4.0原生正式版,我只想要这个. 前几天发布了ubuntu12.04LTS 版本,兴奋ing. 看到 ...

  4. sql产生随机时间

    --建立过程 CREATE PROCEDURE GetTime     @BeginTime VARCHAR(5),     @EndTime VARCHAR(5),     @RandTime VA ...

  5. MathType输入框怎么调整

    在用MathType编辑公式编辑器时,除了可以对MathType工具栏的显示比例进行调整以外,还可以对编辑时的输入框进行调整.这样在编辑的过程中,工具栏可以看得很清楚,同时框输入框也可以看得很清楚,这 ...

  6. 让Zend Studio联系关系CakePHP模板文件.ctp

    让Zend Studio关联CakePHP模板文件.ctp Zend Studio是套强大的PHP编辑器,各种给力让PHP开发者爱不释手.对于CakePHP程序员来说,有件事情相当头疼,在初始安装好Z ...

  7. Mapper method 'com.autoyol.mapper.trans.AccountLogMapper.getTotalIncomByMemNoLastest attempted to return null from a method with a primitive return type (int).解决方法

    1.打开日志输出,降低日志级别. <AppenderRef ref="console" level="trace"></AppenderRef ...

  8. linux下jdk简单配置记录

    记录哈,搭建环境的时候,copy使用方便. vim /etc/profile export JAVA_HOME=/usr/java/jdk1.7.0_79export PATH=$JAVA_HOME/ ...

  9. Java的多线程

    Java使用Thread代表线程,所有的线程对象都必须是Thread类或其子类的实例.每个线程的作用就是执行一段程序流(完成一定的任务). Java使用线程执行体来代表这段程序流. 1. 继承Thre ...

  10. 一个简单的demo学习Android远程Service(AIDL的使用)

    这是milo很早之前写在论坛上的一个帖子,现在整理出来,milo也复习一下一般来说Android 的四大组件都是运行在同一个进程中的,但远程Service运行在不同的进程里.这进程间的通信是使用了An ...