734

给定以下代码:

DB::table('users')->get();

我想获取上面的数据库查询生成器将生成的原始 SQL 查询字符串。在此示例中,它将是SELECT * FROM users.

我该怎么做呢?

4

39 回答 39

960

在实例上使用该toSql()方法。QueryBuilder

DB::table('users')->toSql()会返回:

从“用户”中选择 *

这比连接事件侦听器更容易,并且还允许您在构建查询时随时检查查询的实际外观。

注意:此方法适用于查询构建器或 Eloquent,但toSql()用于代替first()or get()。您不能使用此方法同时运行查询并获取 SQL。

于 2013-12-04T18:24:52.157 回答
914

要将最后运行的查询输出到屏幕,您可以使用以下命令:

DB::enableQueryLog(); // Enable query log

// Your Eloquent query executed by using get()

dd(DB::getQueryLog()); // Show results of log

我相信最近的查询将位于数组的底部。

你会有类似的东西:

array(1) {
  [0]=>
  array(3) {
    ["query"]=>
    string(21) "select * from "users""
    ["bindings"]=>
    array(0) {
    }
    ["time"]=>
    string(4) "0.92"
  }
}

(感谢Joshua 在下面的评论。)

于 2013-08-14T15:59:16.403 回答
147

DB::QueryLog()仅在您使用$builder->get().

如果要在执行查询之前或不执行查询之前获取原始查询,可以使用该$builder->toSql()方法。

获取原始 SQL 并替换“?”的示例 具有实际绑定值:

$query = str_replace(array('?'), array('\'%s\''), $builder->toSql());
$query = vsprintf($query, $builder->getBindings());
dump($query);

$result = $builder->get();

或者您可以故意触发错误,例如,通过使用不存在的表或列。然后您可以在异常消息中看到生成的查询。

于 2017-03-03T14:34:22.130 回答
64

您可以收听“illuminate.query”事件。在查询之前添加以下事件侦听器:

Event::listen('illuminate.query', function($query, $params, $time, $conn) 
{ 
    dd(array($query, $params, $time, $conn));
});

DB::table('users')->get();

这将打印出如下内容:

array(4) {
  [0]=>
  string(21) "select * from "users""
  [1]=>
  array(0) {
  }
  [2]=>
  string(4) "0.94"
  [3]=>
  string(6) "sqlite"
}
于 2013-08-14T16:05:20.627 回答
59

如果您尝试在不使用 Laravel 的情况下使用 Illuminate 获取日志:

\Illuminate\Database\Capsule\Manager::getQueryLog();

您还可以像这样启动一个快速功能:

function logger()
{
    $queries = \Illuminate\Database\Capsule\Manager::getQueryLog();
    $formattedQueries = [];
    foreach ($queries as $query) :
        $prep = $query['query'];

        foreach ($query['bindings'] as $binding) :

            if (is_bool($binding)) {
                $val = $binding === true ? 'TRUE' : 'FALSE';
            } else if (is_numeric($binding)) {
                $val = $binding;
            } else {
                $val = "'$binding'";
            }

            $prep = preg_replace("#\?#", $val, $prep, 1);
        endforeach;
        $formattedQueries[] = $prep;
    endforeach;
    return $formattedQueries;
}

编辑

更新版本似乎默认禁用查询日志记录(上面返回一个空数组)。要重新打开,在初始化 Capsule Manager 时,抓取一个连接实例并调用该enableQueryLog方法

$capsule::connection()->enableQueryLog();

再次编辑

考虑到实际问题,您实际上可以执行以下操作来转换当前单个查询而不是所有先前的查询:

$sql = $query->toSql();
$bindings = $query->getBindings();
于 2015-06-09T11:02:56.513 回答
43

eloquent 中有一种获取查询字符串的方法。

toSql()

在我们的例子中,

 DB::table('users')->toSql(); 

返回

select * from users

是返回 SQL 查询字符串的确切解决方案..希望这有帮助...

于 2016-04-13T11:00:40.953 回答
32
$data = User::toSql();
echo $data; //this will retrun select * from users. //here User is model
于 2017-08-25T08:38:15.333 回答
26

如果你使用 laravel 5.1 和 MySQL,你可以使用我制作的这个函数:

/*
 *  returns SQL with values in it
 */
function getSql($model)
{
    $replace = function ($sql, $bindings)
    {
        $needle = '?';
        foreach ($bindings as $replace){
            $pos = strpos($sql, $needle);
            if ($pos !== false) {
                if (gettype($replace) === "string") {
                     $replace = ' "'.addslashes($replace).'" ';
                }
                $sql = substr_replace($sql, $replace, $pos, strlen($needle));
            }
        }
        return $sql;
    };
    $sql = $replace($model->toSql(), $model->getBindings());
    
    return $sql;
}

作为输入参数,您可以使用其中任何一个

照亮\数据库\雄辩\建设者

照亮\数据库\雄辩\关系\HasMany

照亮\数据库\查询\生成器

于 2016-05-18T02:59:57.517 回答
26

这是我可以建议任何人调试雄辩的最后一个查询或最终查询的最佳解决方案,尽管这也已讨论过:

// query builder
$query = DB::table('table_name')->where('id', 1);

// binding replaced
$sql = str_replace_array('?', $query->getBindings(), $query->toSql());

// for laravel 5.8^
$sql = Str::replaceArray('?', $query->getBindings(), $query->toSql());

// print
dd($sql);
于 2019-06-12T05:57:03.540 回答
19

首先,您需要通过调用启用查询日志:

DB::enableQueryLog();

使用 DB 外观查询后,您可以编写:

dd(DB::getQueryLog());

输出将如下所示:

array:1 [▼
  0 => array:3 [▼
    "query" => "select * from `users` left join `website_user` on `users`.`id` = `website_user`.`user_id` left join `region_user` on `users`.`id` = `region_user`.`user_id` left ▶"
    "bindings" => array:5 [▶]
    "time" => 3.79
  ]
]
于 2018-08-31T04:29:41.703 回答
16

使用绑定获取 SQL 查询的“可宏”替换。

  1. 在方法中添加以下宏功能。AppServiceProvider boot()

    \Illuminate\Database\Query\Builder::macro('toRawSql', function(){
        return array_reduce($this->getBindings(), function($sql, $binding){
            return preg_replace('/\?/', is_numeric($binding) ? $binding : "'".$binding."'" , $sql, 1);
        }, $this->toSql());
    });
    
  2. 为 Eloquent Builder 添加一个别名。( Laravel 5.4+ )

    \Illuminate\Database\Eloquent\Builder::macro('toRawSql', function(){
        return ($this->getQuery()->toRawSql());
    });
    
  3. 然后像往常一样调试。( Laravel 5.4+ )

    例如查询生成器

    \Log::debug(\DB::table('users')->limit(1)->toRawSql())
    

    例如 Eloquent Builder

    \Log::debug(\App\User::limit(1)->toRawSql());
    

注意:从 Laravel 5.1 到 5.3,由于 Eloquent Builder 没有使用Macroabletrait,所以不能动态toRawSql地为 Eloquent Builder 添加别名。按照下面的示例来实现相同的目的。

例如 Eloquent Builder ( Laravel 5.1 - 5.3 )

\Log::debug(\App\User::limit(1)->getQuery()->toRawSql());
于 2018-10-31T07:08:39.040 回答
14

第一种方式:

只需您可以使用toSql()方法执行以下操作,

$query = DB::table('users')->get();

echo $query->toSql();

如果它不起作用,您可以从laravel 文档中进行设置。

第二种方式:

另一种方法是

DB::getQueryLog()

但如果它返回一个空数组,那么默认情况下它被禁用访问 this

只需启用DB::enableQueryLog()它就可以了:)

有关更多信息,请访问 Github Issue以了解更多信息。

希望能帮助到你 :)

于 2017-04-25T05:45:00.433 回答
14

从 Laravel 5.8.15 开始,查询构建器现在具有 dddump方法,因此您可以这样做

DB::table('data')->where('a', 1)->dump();
于 2019-10-11T06:47:27.820 回答
12

最简单的方法就是故意犯错。例如,我想查看以下关系的完整 SQL 查询:

 public function jobs()
        {
            return $this->belongsToMany(Job::class, 'eqtype_jobs')
                   ->withPivot(['created_at','updated_at','id'])
                   ->orderBy('pivot_created_at','desc');
        }

我只是为了找不到一个列,在这里我选择created_atcreated_ats通过添加尾随s将其更改为:

public function jobs()
            {
                return $this->belongsToMany(Job::class, 'eqtype_jobs')
                       ->withPivot(['created_ats','updated_at','id'])
                       ->orderBy('pivot_created_at','desc');
            }

因此,调试器将返回以下错误:

(4/4) ErrorException SQLSTATE[42S22]: Column not found: 1054 Unknown column 'eqtype_jobs.created_ats' in 'field list' (SQL: select jobs.*, eqtype_jobs. set_idas pivot_set_id, eqtype_jobs. job_idas pivot_job_id, eqtype_jobs. created_ats as pivot_created_ats, eqtype_jobs. updated_atas pivot_updated_at, eqtype_jobs. idas pivot_idfrom . = .上的jobs内部连接,其中 . = 56 order by desc limit 20 offset 0) (查看:/home/said/www/factory/resources/views/set/show.blade.php)eqtype_jobsjobsideqtype_jobsjob_ideqtype_jobsset_idpivot_created_at

上面的错误信息返回带有错误的完整 SQL 查询

SQL: select  jobs.*, eqtype_jobs.set_id as pivot_set_id,  eqtype_jobs.job_id as pivot_job_id, eqtype_jobs.created_ats as pivot_created_ats, eqtype_jobs.updated_at as  pivot_updated_at, eqtype_jobs.id as pivot_id from jobs inner join eqtype_jobs on jobs.id = eqtype_jobs.job_id where  eqtype_jobs.set_id = 56 order by pivot_created_at desc limit 20 offset 0

现在,只需从 created_at 中删除多余的部分s,然后在任何 SQL 编辑器(如 phpMyAdmin SQL 编辑器)中随意测试此 SQL!

注意:

该解决方案已使用Laravel 5.4进行了测试。

于 2018-06-08T19:34:12.880 回答
12

在我看来,这将是初学者的最佳方法:

echo "<pre>";
print_r($query->toSql());
print_r($query->getBindings());

此处也对此进行了描述。 https://stackoverflow.com/a/59207557/9573341

于 2019-12-06T05:50:31.387 回答
11

将此函数添加到您的应用程序并简单地调用。

function getQuery($sql){
        $query = str_replace(array('?'), array('\'%s\''), $sql->toSql());
        $query = vsprintf($query, $sql->getBindings());     
        return $query;
}

输出:“select * from userwhere lang= 'en' and status= '1' order by updated_atdesc limit 25 offset 0”

于 2019-12-19T05:41:10.427 回答
10

使用调试栏包

composer require "barryvdh/laravel-debugbar": "2.3.*"

在此处输入图像描述

于 2017-07-18T08:09:28.780 回答
10

已经回答了很多信息,只要我需要在执行之前输出 sql 查询,我就会发布我自己的发现。

考虑以下示例:

$user = DB::table('user')->where('id',1);
echo $user->toSql();

echo $user->toSql() = 这只会输出原始查询,但不会显示传递的参数。

要输出带有传递参数的查询,我们可以像这样使用 laravel getBindings()和 helper str_replace_array

$queryWithParam = str_replace_array('?',$user->getBindings(),$user->toSql());
echo $queryWithParam;

希望这也有帮助。

于 2021-01-27T09:50:24.727 回答
8

从 laravel5.2开始。你可以DB::listen用来获取执行的查询。

DB::listen(function ($query) {
    // $query->sql
    // $query->bindings
    // $query->time
});

或者,如果您想调试单个Builder实例,则可以使用toSql方法。

DB::table('posts')->toSql(); 
于 2017-08-02T17:01:59.063 回答
7

要查看 Laravel 执行的查询,请使用 laravel 查询日志

DB::enableQueryLog();

$queries = DB::getQueryLog();
于 2017-11-21T04:35:17.123 回答
6

这是我放置在我的基础模型类中的函数。只需将查询构建器对象传递给它,就会返回 SQL 字符串。

function getSQL($builder) {
  $sql = $builder->toSql();
  foreach ( $builder->getBindings() as $binding ) {
    $value = is_numeric($binding) ? $binding : "'".$binding."'";
    $sql = preg_replace('/\?/', $value, $sql, 1);
  }
  return $sql;
}
于 2016-12-28T08:59:41.530 回答
6

您可以使用 toSql 方法 - 最简单的方法

DB::table('users')->toSql();

而且,如果您的查询中有绑定并且希望查看带有绑定的查询。你不能使用这样的东西:

$query = DB::table('table')->whereIn('some_field', [1,2,30]); 

$sql_with_bindings = str_replace_array('?', $query->getBindings(), $query->toSql());

dd($sql_with_bindings);
于 2020-12-28T11:17:34.587 回答
5

尝试这个:

$results = DB::table('users')->toSql();
dd($results);

注意:get() 已替换为 toSql() 以显示原始 SQL 查询。

于 2019-09-12T10:09:27.373 回答
4

对于 laravel 5.5.X

如果您想接收应用程序执行的每个 SQL 查询,您可以使用 listen 方法。此方法对于记录查询或调试很有用。您可以在服务提供者中注册您的查询侦听器:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        DB::listen(function ($query) {
            // $query->sql
            // $query->bindings
            // $query->time
        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

资源

于 2017-09-06T09:53:20.310 回答
4

我这样做的方式,基于日志视图,只需要修改文件app/Providers/AppServiceProvider.php

  1. 将此代码添加到app/Providers/AppServiceProvider.php
/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    //
    DB::listen(function ($query) {
        $querySql = str_replace(['?'], ['\'%s\''], $query->sql);
        $queryRawSql = vsprintf($querySql, $query->bindings);
        Log::debug('[SQL EXEC]', [
                "raw sql"  => $queryRawSql,
                "time" => $query->time,
            ]
        );
    });
}
  1. 我的 sql 句柄代码:
$users = DB::table('users')
    ->select(DB::raw('count(*) as user_count, username '))
    ->where('uid', '>=', 10)
    ->limit(100)
    ->groupBy('username')
    ->get()
;
dd($users);
  1. 见日志storage/logs/laravel-2019-10-27.log
[2019-10-27 17:39:17] local.DEBUG: [SQL EXEC] {"raw sql":"select count(*) as user_count, username  from `users` where `uid` >= '10' group by `username` limit 100","time":304.21} 
于 2019-10-27T17:43:22.587 回答
3

您可以使用此包获取加载页面时正在执行的所有查询

https://github.com/barryvdh/laravel-debugbar
于 2015-07-14T14:01:26.903 回答
3

尽管我很喜欢这个框架,但我讨厌它表现得像废话。

DB::enableQueryLog()完全没用。DB::listen同样没用。当我说时它显示了部分查询$query->count(),但如果我这样做$query->get(),它无话可说。

唯一似乎始终有效的解决方案是故意在 ORM 参数中放置一些语法或其他错误,例如不存在的列/表名称,在调试模式下在命令行上运行代码,它会吐出 SQL 错误终于有了完整的 frickin 查询。否则,如果从 Web 服务器运行,希望错误出现在日志文件中。

于 2018-06-14T22:17:26.647 回答
3

打印最后一个查询

DB::enableQueryLog();

$query        = DB::getQueryLog();
$lastQuery    = end($query);
print_r($lastQuery);
于 2018-10-01T07:18:12.650 回答
3

如果你正在使用 tinker 并且想要记录形成的 SQL 查询,你可以这样做

$ php artisan tinker
Psy Shell v0.9.9 (PHP 7.3.5 — cli) by Justin Hileman
>>> DB::listen(function ($query) { dump($query->sql); dump($query->bindings); dump($query->time); });
=> null
>>> App\User::find(1)
"select * from `users` where `users`.`id` = ? limit 1"
array:1 [
  0 => 1
]
6.99
=> App\User {#3131
     id: 1,
     name: "admin",
     email: "admin@example.com",
     created_at: "2019-01-11 19:06:23",
     updated_at: "2019-01-11 19:06:23",
   }
>>>
于 2019-07-16T10:43:12.660 回答
3

为了记录所有执行的查询,您可以使用DB::enableQueryLog() icw DB::getQueryLog()。输出具有以下结构。

[
  [
    "query" => "select * from "users" where name = ?"
    "bindings" => ["John Doe"]
    "time" => 0.34
  ],
  ...
]

此外,我在这里结合了一些答案,以获得完美的函数来解析带有编译绑定的 sql。见下文。我什至创建了一个自定义的 Builder 类来实现这个功能,例如 User::where('name','John Doe')->parse();

function parse_sql(string $sql, array $bindings) : string
{
  $compiled_bindings  = array_map('compile_binding', $bindings);

  return preg_replace_array("/\?/", $compiled_bindings, $sql);
}

function compile_binding($binding)
{
  $grammar = new MySqlGrammar;

  if (is_bool($binding))
  {
    return (int)$binding; //This line depends on the database implementation
  }

  if(is_string($binding))
  {
    return "'$binding'";
  }

  if ($binding instanceof DateTimeInterface)
  {
    return $binding->format($grammar->getDateFormat());
  }

  return $binding;
}
于 2021-06-29T10:02:21.417 回答
2

如果你没有使用 Laravel 而是使用 Eloquent 包,那么:

use \Illuminate\Database\Capsule\Manager as Capsule;
use \Illuminate\Events\Dispatcher;
use \Illuminate\Container\Container;

$capsule = new Capsule;

$capsule->addConnection([
    // connection details
]);
// Set the event dispatcher used by Eloquent models... (optional)
$capsule->setEventDispatcher(new Dispatcher(new Container));

// Make this Capsule instance available globally via static methods... (optional)
$capsule->setAsGlobal();

// Setup the Eloquent ORM...(optional unless you've used setEventDispatcher())
$capsule->bootEloquent();

// Listen for Query Events for Debug
$events = new Dispatcher;
$events->listen('illuminate.query', function($query, $bindings, $time, $name)
{
    // Format binding data for sql insertion
    foreach ($bindings as $i => $binding) {
        if ($binding instanceof \DateTime) {
            $bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
        } else if (is_string($binding)) {
            $bindings[$i] = "'$binding'";`enter code here`
        }
    }

    // Insert bindings into query
    $query = str_replace(array('%', '?'), array('%%', '%s'), $query);
    $query = vsprintf($query, $bindings);

    // Debug SQL queries
    echo 'SQL: [' . $query . ']';
});

$capsule->setEventDispatcher($events);
于 2015-11-24T09:29:02.507 回答
2

你可以使用发条

Clockwork 是一个用于 PHP 开发的 Chrome 扩展,通过一个新面板扩展了开发者工具,提供了对调试和分析 PHP 应用程序有用的各种信息,包括有关请求、标头、获取和发布数据、cookie、会话数据、数据库查询的信息,路线,应用程序运行时的可视化等等。

但也适用于 Firefox

于 2015-12-11T16:39:03.130 回答
2

我创建了一些简单的函数来从一些查询中获取 SQL 和绑定。

/**
 * getSql
 *
 * Usage:
 * getSql( DB::table("users") )
 * 
 * Get the current SQL and bindings
 * 
 * @param  mixed  $query  Relation / Eloquent Builder / Query Builder
 * @return array          Array with sql and bindings or else false
 */
function getSql($query)
{
    if( $query instanceof Illuminate\Database\Eloquent\Relations\Relation )
    {
        $query = $query->getBaseQuery();
    }

    if( $query instanceof Illuminate\Database\Eloquent\Builder )
    {
        $query = $query->getQuery();
    }

    if( $query instanceof Illuminate\Database\Query\Builder )
    {
        return [ 'query' => $query->toSql(), 'bindings' => $query->getBindings() ];
    }

    return false;
}

/**
 * logQuery
 *
 * Get the SQL from a query in a closure
 *
 * Usage:
 * logQueries(function() {
 *     return User::first()->applications;
 * });
 * 
 * @param  closure $callback              function to call some queries in
 * @return Illuminate\Support\Collection  Collection of queries
 */
function logQueries(closure $callback) 
{
    // check if query logging is enabled
    $logging = DB::logging();

    // Get number of queries
    $numberOfQueries = count(DB::getQueryLog());

    // if logging not enabled, temporarily enable it
    if( !$logging ) DB::enableQueryLog();

    $query = $callback();

    $lastQuery = getSql($query);

    // Get querylog
    $queries = new Illuminate\Support\Collection( DB::getQueryLog() );

    // calculate the number of queries done in callback
    $queryCount = $queries->count() - $numberOfQueries;

    // Get last queries
    $lastQueries = $queries->take(-$queryCount);

    // disable query logging
    if( !$logging ) DB::disableQueryLog();

    // if callback returns a builder object, return the sql and bindings of it
    if( $lastQuery )
    {
        $lastQueries->push($lastQuery);
    }

    return $lastQueries;
}

用法:

getSql( DB::table('users') );
// returns 
// [
//     "sql" => "select * from `users`",
//     "bindings" => [],
// ]

getSql( $project->rooms() );
// returns
// [
//     "sql" => "select * from `rooms` where `rooms`.`project_id` = ? and `rooms`.`project_id` is not null",
//     "bindings" => [ 7 ],
// ]
于 2016-03-01T10:10:49.603 回答
2

这是一个完美的例子:

https://laravel.com/docs/5.8/database#listening-for-query-events

打开 app\Providers\AppServiceProvider.php 并将以下内容添加到 Boot() 函数:

DB::listen(function ($query) {
    var_dump([
        $query->sql,
        $query->bindings,
        $query->time
    ]);
});

所以你不需要把DB::enableQuerylog()andDB::getQuerylog()放在每个函数中。

于 2020-02-24T05:44:18.863 回答
2

将此代码添加到您的 AppServiceProvider 并获取日志文件

         \DB::listen(function ($query) {
             \Log::info(
                 $query->sql,
                 $query->bindings,
                 $query->time
             );
         });
于 2020-09-25T14:04:18.830 回答
1

第一个选项

绝对有办法只输出一个查询,并在 phpMyAdmin 或其他工具中进行调试,以了解查询的执行方式。

一种将查询与变量(也称为绑定)一起转储的好方法,您可以将以下函数添加为项目中的常用助手

function queryToSQL($query, $logQuery = true)
{
    $addSlashes = str_replace('?', "'?'", $query->toSql());

    $sql = str_replace('%', '#', $addSlashes);

    $sql = str_replace('?', '%s', $sql);

    $sql = vsprintf($sql, $query->getBindings());

    $sql = str_replace('#', '%', $sql);

    if ($logQuery) {
        Log::debug($sql);
    }

    return $sql;
}

第二种选择

这是一种替代方法,而不是转储您的每个查询,您可以使用Telescope,此工具可让您更深入地了解可能在后台触发的所有查询以及每个查询与所有绑定一起花费的时间显示

Laravel 望远镜示例

第三个选项

Laravel Debugbar是一个了不起的插件,它可以帮助您在小底栏下调试所有内容,但这仅适用于基于 UI 的活动,对于 API 或命令,调试方式被错过了 Telescope 成为一个很好的帮手

Laravel 调试栏示例

于 2021-10-16T05:28:59.177 回答
0

这是我使用的解决方案:

DB::listen(function ($sql, $bindings, $time) {
    $bound = preg_replace_callback("/\?/", function($matches) use ($bindings) {
        static $localBindings;
        if (!isset($localBindings)) {
            $localBindings = $bindings;
        }
        $val = array_shift($localBindings);

        switch (gettype($val)) {
            case "boolean":
                $val = ($val === TRUE) ? 1 : 0;  // mysql doesn't support BOOL data types, ints are widely used
                // $val = ($val === TRUE) ? "'t'" : "'f'";   // todo: use this line instead of the above for postgres and others
                break;

            case "NULL":
                $val = "NULL";
                break;

            case "string":
            case "object":
                $val = "'". addslashes($val). "'";   // correct escaping would depend on the RDBMS
                break;
        }
        return $val;
    }, $sql);
    array_map(function($x) { 
        (new \Illuminate\Support\Debug\Dumper)->dump($x); 
    }, [$sql, $bindings, $bound]);
});

请阅读代码中的注释。我知道,它并不完美,但对于我的日常调试来说还可以。它尝试以或多或少的可靠性构建绑定查询。但是,不要完全相信它,数据库引擎以不同的方式转义这个短函数没有实现的值。因此,请谨慎对待结果。

于 2017-07-05T07:55:43.587 回答
0

我通过侦听查询日志并附加到日志数组来做到这一点:

//create query
$query=DB::table(...)...->where(...)...->orderBy(...)...
$log=[];//array of log lines
...
//invoked on query execution if query log is enabled
DB::listen(function ($query)use(&$log){
    $log[]=$query;//enqueue query data to logs
});
//enable query log
DB::enableQueryLog();
$res=$query->get();//execute
于 2019-11-05T09:24:37.760 回答
-2

利用:

$data = DB::select('select * from users where id = :id', ['id' => 1]);
print_r($data);

输出如下:

Array ( [0] => stdClass Object ( [id] => 1 [name] => parisa [last] => naderi [username] => png [password] => 2132 [role] => 0 ) )
于 2019-02-23T11:13:31.233 回答