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

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

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

【问题讨论】:

标签: php laravel


【解决方案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

                谢谢

                【讨论】:

                  猜你喜欢
                  • 2020-10-30
                  • 2015-10-20
                  • 1970-01-01
                  • 2020-11-08
                  • 2017-10-22
                  • 2022-12-02
                  • 2015-02-22
                  • 2017-06-05
                  • 1970-01-01
                  相关资源
                  最近更新 更多