[英]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.