簡體   English   中英

Laravel 5 Eloquent:如何獲取正在執行的原始 sql? (帶有綁定數據)

[英]Laravel 5 Eloquent: How to get raw sql that is being executed? (with binded data)

我試圖弄清楚如何獲取正在執行的原始 sql 查詢,包括其中的綁定數據。 這是我得到的:

\DB::connection()->enableQueryLog();
$query = \DB::getQueryLog();
$lastQuery = end($query);

結果如下:

array(3) {
  ["query"]=>
  string(57) "select * from `table_1` where `field_1` = ? limit 1"
  ["bindings"]=>
  array(1) {
    [0]=>
    string(34) "xyz"
  }
}

那么我如何獲得像這樣的完整 sql 查詢的轉儲(好的老式方式)?

select * from `table_1` where `field_1` = 'xyz' limit 1

謝謝

您可能想查看Laravel 調試欄 沒有它,我不會開發 Laravel 應用程序。 它將為您提供所有查詢(包括重復查詢和 ajax 查詢)的細分,以及它們執行的速度以及調用它們的控制器/方法中的行的注釋。 (它還提供了 TONS 更多信息,例如視圖、大門、路線等)

此外,Laravel 有一個toSql()方法,您可以使用它來代替示例。 它只會像您的示例那樣向您顯示准備好的語句,但它至少更簡潔一些。 如果您使用toSql() ,則必須在執行查詢之前應用它。

$foo = Foo::where('bar', 'baz');
$foo_sql = $foo->toSql();
$foo->get();

將此添加到您的路線文件夾中:

\Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {
    Log::info( json_encode($query->sql) );
    Log::info( json_encode($query->bindings) );
    Log::info( json_encode($query->time)   );
});

Log::info() ==> 將在您的 storage/logs/laravel.log 文件中記錄 SQL 查詢

var_dump() ==> 將顯示在 API 調用輸出中

將此函數添加到您的應用程序中,只需調用即可。

function getQuery($sql){
        $query = str_replace(array('?'), array('\'%s\''), $sql->toSql());
        $query = vsprintf($query, $sql->getBindings());     
        return $query;
}
$foo = Foo::where('bar', 'baz');
print_r(getQuery($foo));

輸出: select * from Foo where bar = 'baz'

嘗試為查詢添加事件偵聽器:

Event::listen('illuminate.query', function($query)
{
    var_dump($query);
});

$results = User::where('id',$id)->toSql();
dd($results)

另一種選擇是從Laravel Debugbar獲取查詢:

$queries = debugbar()->getCollector('queries');  
$statements = $queries->collect()['statements'];
dd($statements);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM