laravel 查看sql
方法一:
我们有时候想测试一段代码生产的 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, 别忘记引入它们。
解释一下上面的代码:
illuminate.query事件触发时的参数为两个:handle($sql, $params), SQL 预处理语句与查询参数值;- 我们只在开发环境记录 SQL:
env('APP_ENV', 'production') == 'local'; - 我们的参数里可能存在日期类型,所以直接记日志会报错,所以处理一下:
$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的更多相关文章
- laravel查看sql语句
我自己是用第一种方法来调试的,第三种不行 不知道为啥 laravel查看sql语句 方法一: 我们有时候想测试一段代码生产的 SQL 语句,比如: 我们想看 App\User::all(); 产生的 ...
- laravel 查看SQL语句
Route::get('/test-sql', function(){ DB::enableQueryLog(); $user = App\User::first(); return DB::getQ ...
- 查看 Laravel 的 SQL 语句的方法
在使用 Laravel 的 Eloquent 进行数据查询的时候,很多小伙伴都想看到背后执行的 SQL 语句到底是什么样的,这小笔录就是解决这个小问题的: 在 Providers/AppService ...
- ORACLE查看SQL的执行次数/频率
在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致.如果执行频繁的S ...
- 知方可补不足~sqlserver中使用sp_who查看sql的进程
回到目录 在SQLSERVER中每个会话,即每个查询分析器窗口都会产生一个SQL进程,对于那些持续时间短的进程,它们转瞬即失,而对于持续时间比较长的,我们需要希望查看它的运行状态,就可以借助SQL提供 ...
- 查看SQL Server多实例的版本
通过 select @@version 查看当前的 SQL Server 安装的版本: 结果返回的是 SQL Server 2008 R2 (SP1),可安装的明明是 SQL Server 2012 ...
- SQL Server:查看SQL日志文件大小命令:dbcc sqlperf(logspace)
SQL Server:查看SQL日志文件大小命令:dbcc sqlperf(logspace) DBA 日常管理工作中,很重要一项工作就是监视数据库文件大小,及日志文件大小.如果你管理数据库的有很 ...
- 快速查看SQL Server 中各表的数据量以及占用空间大小
快速查看SQL Server 中各表的数据量以及占用空间大小. CREATE TABLE #T (NAME nvarchar(100),ROWS char(20),reserved varchar(1 ...
- 查看SQL执行计划
一用户进入某界面慢得要死,查看SQL执行计划如下(具体SQL语句就不完全公布了,截断的如下): call count cpu elapsed disk ...
随机推荐
- linux命令中的head命令
head命令和tail命令就像他的名字一样浅显易懂,它是用来显示开头或者结尾某个数量的文字区块,head用来显示档案的开头至标准输出当中,而tail想当然就是查看档案的结尾. 命令格式 head [ ...
- sublime3 docblocker插件定制自己的注释,配置步骤
DocBlockr很好用,不仅仅可以自动生成注释,还可以手动编辑注释的格式. 安装方法: Cmd+Shift+P -> Install Package -> docblockr wi ...
- ubuntu 12.04和Windows 7双系统的安装方法
ubuntu是一个操作系统,和安卓一样同是linux内核下的子民,所以来这贡献一下,也求JW放出安卓4.0原生正式版,我只想要这个. 前几天发布了ubuntu12.04LTS 版本,兴奋ing. 看到 ...
- sql产生随机时间
--建立过程 CREATE PROCEDURE GetTime @BeginTime VARCHAR(5), @EndTime VARCHAR(5), @RandTime VA ...
- MathType输入框怎么调整
在用MathType编辑公式编辑器时,除了可以对MathType工具栏的显示比例进行调整以外,还可以对编辑时的输入框进行调整.这样在编辑的过程中,工具栏可以看得很清楚,同时框输入框也可以看得很清楚,这 ...
- 让Zend Studio联系关系CakePHP模板文件.ctp
让Zend Studio关联CakePHP模板文件.ctp Zend Studio是套强大的PHP编辑器,各种给力让PHP开发者爱不释手.对于CakePHP程序员来说,有件事情相当头疼,在初始安装好Z ...
- 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 ...
- linux下jdk简单配置记录
记录哈,搭建环境的时候,copy使用方便. vim /etc/profile export JAVA_HOME=/usr/java/jdk1.7.0_79export PATH=$JAVA_HOME/ ...
- Java的多线程
Java使用Thread代表线程,所有的线程对象都必须是Thread类或其子类的实例.每个线程的作用就是执行一段程序流(完成一定的任务). Java使用线程执行体来代表这段程序流. 1. 继承Thre ...
- 一个简单的demo学习Android远程Service(AIDL的使用)
这是milo很早之前写在论坛上的一个帖子,现在整理出来,milo也复习一下一般来说Android 的四大组件都是运行在同一个进程中的,但远程Service运行在不同的进程里.这进程间的通信是使用了An ...