Laravel Eloquent 显示查询日志

Posted

技术标签:

【中文标题】Laravel Eloquent 显示查询日志【英文标题】:Laravel Eloquent display query log 【发布时间】:2017-04-29 16:29:40 【问题描述】:
use App\Order;
 
public function show(Order $order) 
    $data = $order->all();
    return dd($order->getQueryLog());

有什么方法可以在 Laravel 中显示 Eloquent 构建的查询吗?

我试过getQueryLog(); 但它不起作用

【问题讨论】:

How to get the query executed in Laravel 5 ? DB::getQueryLog returning empty array的可能重复 【参考方案1】:

首先你必须启用查询日志 可以使用

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

那么你可以使用下面的代码来查看查询日志

$queries = DB::getQueryLog();

如果你想查看最后执行的查询

$last_query = end($queries);

要了解有关日志记录的更多信息,请参阅https://laravel.com/docs/5.0/database#query-logging

例子

public function show(Order $order)
    \DB::connection()->enableQueryLog();
    $data = $order->all();
    $queries = \DB::getQueryLog();
    return dd($queries);

【讨论】:

这仅用于数据库查询吗?我用的是eloquent,想看laravel的查询 它也适用于 eloquent,检查我在示例中显示的更新答案 哦我不知道我需要把 enableQueryLog();在我的查询之前,我把它放在后面大声笑,谢谢!【参考方案2】:

要查看laravel.log 文件中的查询日志,您可以按如下方式进行。

namespace App\Providers;

use DB;
use Log;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    
        DB::listen(function($query) 
            Log::info(
                $query->sql,
                $query->bindings,
                $query->time
            );
        );
    

    // ...

【讨论】:

哇,我希望我在几年前就知道这一点。太有帮助了!谢谢。【参考方案3】:

要使用getQueryLog(),您需要先启用它:

DB::enableQueryLog();
DB::getQueryLog();

如果你想查看真实的查询,可以使用Laravel Debugbar,它将显示 Laravel 在当前请求期间创建的所有真实查询。

有时->toSql() 也很有用。

【讨论】:

【参考方案4】:

在 5.6 上工作,在 AppServiceProvider::boot() 中是这样的

    // Log all DB SELECT statements
    // @codeCoverageIgnoreStart
    if (!app()->environment('testing') && config('app.log_sql')) 
        DB::listen(function ($query) 
            if (preg_match('/^select/', $query->sql)) 
                Log::info('sql: ' .  $query->sql);
                // Also available are $query->bindings and $query->time.
            
        );
    

然后在 config/app.php 中,这样就可以很容易地启用/禁用修改 .env

    'log_sql' => env('LOG_SQL'),

所有感谢:https://arjunphp.com/laravel-5-5-log-eloquent-queries/

这可以解析为独特的查询:

    grep ") sql:" laravel.log | sed -e "s#.*select\(.*\)\[\]#select\1#" | sort -u

【讨论】:

【参考方案5】:

我知道这是一个老问题,但它可能会帮助其他有同样问题的人。

如果您使用默认连接以外的其他连接,则应指定它以正确获取查询日志。

\DB::connection('YourConnection')->enableQueryLog();
$test = MyModel::all();
$queries = \DB::connection('YourConnection')->getQueryLog();
dd($queries);

【讨论】:

【参考方案6】:

在查询前写下 DB::enableQueryLog();

DB::enableQueryLog();

$data = $order->all();

$query = DB::getQueryLog();

dd($query);

【讨论】:

【参考方案7】:

你可以使用这个包https://github.com/supliu/laravel-query-monitor

Após instalar, abra o terminal e execute o comando:

php artisan laravel-query-monitor

Eloquent 执行的所有查询都会实时显示

【讨论】:

【参考方案8】:

查询执行

\Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query)           
            $sql = $query->sql; 
            $time = $query->time;
            $connection = $query->connection->getName();
 
            Log::debug('query : '.$sql);
            Log::debug('time '.$time);
            Log::debug('connection '.$connection);
        );

查询

StaffRegister::all();

输出

[2021-03-14 08:00:57] local.DEBUG: query : select * from `staff_registers`  
[2021-03-14 08:00:57] local.DEBUG: time 0.93  
[2021-03-14 08:00:57] local.DEBUG: connection mysql  

结构完整

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Log;
use App\Models\StaffRegister;

class AuthController extends Controller

   public function index()
   
       \Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) 
      
           $sql = $query->sql; 
           $time = $query->time;
           $connection = $query->connection->getName();

           Log::debug('query : '.$sql);
           Log::debug('time '.$time);
           Log::debug('connection '.$connection);
       );

       $obj = StaffRegister::all(); 
    
       return $obj;
   

准确的方法

【讨论】:

【参考方案9】:

您可以使用::toSql()-&gt;toSql(),如下所示:

use App\Order;

public function show(Order $order)

    return $order::toSql();

或者

use App\Order;

public function show(Order $order)

    return $order::where("id", "<>", 0)->toSql();

您可能必须启用查询日志:

DB::enableQueryLog();

【讨论】:

【参考方案10】:

你可以使用我的 Laravel 包,它可以在 Larave 6 和 7 中完美运行。(不确定 laravel 5 或更低版本。)

供使用 通过 composer 安装包: 通过以下命令

composer require dipenparmar12/laravel-query-log

重启服务器。 之后你会看到

storage/logs/db-query.log 包含您的查询日志的文件。

更多详情请访问Laravel-query-log

谢谢

【讨论】:

以上是关于Laravel Eloquent 显示查询日志的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent builder 查询日志

Laravel:Mysql 查询到 Eloquent

Laravel:在没有 Eloquent 的情况下在视图中显示数据

相关模型 eloquent laravel 中的自定义查询

Laravel Eloquent—基本概念用法

php [Eloquent CheatSheet] Eloquent #laravel #eloquent的常见查询方法