Nhận truy vấn được thực hiện trong Laravel 3/4


182

Làm cách nào tôi có thể truy xuất truy vấn SQL đã thực hiện thô trong Laravel 3/4 bằng Trình tạo truy vấn Laravel hoặc ORM Eloquent?

Ví dụ, một cái gì đó như thế này:

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

Hoặc là:

(posts (id, user_id, ...))

User::find(1)->posts->get();

Mặt khác, ít nhất làm thế nào tôi có thể lưu tất cả các truy vấn được thực hiện vào laravel.log?


Còn ở ấu trùng 5 thì sao?
Chaudhry Waqas

Câu trả lời:


318

Ấu trùng 4+

Trong Laravel 4 trở lên, bạn phải gọi DB::getQueryLog()để nhận tất cả các truy vấn đã chạy.

$queries = DB::getQueryLog();
$last_query = end($queries);

Hoặc bạn có thể tải xuống một gói profiler. Tôi muốn giới thiệu barryvdh / laravel-debugbar , khá gọn gàng. Bạn có thể đọc để được hướng dẫn về cách cài đặt trong kho lưu trữ của họ .

Lưu ý cho người dùng Laravel 5: Bạn sẽ cần gọi DB::enableQueryLog()trước khi thực hiện truy vấn. Hoặc ngay phía trên dòng chạy truy vấn hoặc bên trong một phần mềm trung gian.


Ấu trùng 3

Trong Laravel 3, bạn có thể nhận được truy vấn được thực hiện cuối cùng từ một Eloquentmô hình gọi phương thức tĩnh last_querytrên DBlớp.

DB::last_query();

Điều này, tuy nhiên, yêu cầu bạn kích hoạt profilertùy chọn trong application/config/database.php. Ngoài ra, bạn có thể, như @dualed đã đề cập, kích hoạt profilertùy chọn, trong application/config/application.phphoặc gọi DB::profile()để nhận tất cả các truy vấn đã chạy trong yêu cầu hiện tại và thời gian thực hiện của chúng.


2
Mã của bạn cho Laravel 4 không hoạt động. Tôi nhận được điều này ErrorException: Cảnh báo: call_user_func_array()hy vọng tham số 1 là một cuộc gọi lại hợp lệ, lớp Illuminate\Database\MySqlConnectionkhông có phương thức getQueryList.
duality_

Xấu của tôi, phương pháp đúng là getQueryLog. Đã sửa nó ngay. Cảm ơn!
rmobis

Lạ ... Tôi không nhận được last_query () trên lỗi đối tượng Truy vấn. Tôi chỉ đang kêu gọi một mô hình Eloquent không có căn cứ.
MP Aditya

1
Đối với Laravel 3, nó thực sự là DB :: last_query (); Bạn cũng cần đặt 'hồ sơ' thành đúng trong ứng dụng / config / cơ sở dữ liệu của mình
Dan Smart

4
Điều này dường như không hoạt động đối với Mô hình Eloquent trên L4. Khi tôi thực hiện Model :: find ($ id) và thực hiện DB :: getQueryLog () trả về mảng trống (). Bất kỳ ý tưởng làm thế nào để có được các truy vấn cho một mô hình Eloquent?
Abishek

31

Bạn có thể bật " Profiler " trong Laravel 3 bằng cách cài đặt

'profiler' => true,

Trong bạn application/config/application.phpapplication/config/database.php

Điều này cho phép một thanh ở dưới cùng của mỗi trang. Một trong những tính năng của nó là liệt kê các truy vấn được thực hiện và mỗi truy vấn mất bao lâu.

nhập mô tả hình ảnh ở đây


14
Lưu ý rằng trong Laravel 4, Profiler không được bao gồm, bạn phải tự cài đặt nó (ví dụ: sử dụng trình soạn thảo). Xem câu hỏi SO này .
duality_

1
Nó được thảo luận trong câu trả lời đầu tiên ở đó .
duality_

24

Đối với Eloquent bạn chỉ có thể làm:

$result->getQuery()->toSql();

Nhưng bạn cần xóa phần "-> get ()" khỏi truy vấn của mình.


17

Tôi sẽ khuyên bạn nên sử dụng tiện ích mở rộng Chrome Clockwork với gói Laravel https://github.com/its gửid /clockwork . Thật dễ dàng để cài đặt và sử dụng.

Clockwork là một tiện ích mở rộng của Chrome để phát triển PHP, mở rộng Công cụ dành cho nhà phát triển với bảng điều khiển mới cung cấp tất cả các loại thông tin hữu ích để gỡ lỗi và cấu hình các tập lệnh PHP của bạn, bao gồm thông tin theo yêu cầu, tiêu đề, dữ liệu GET và POST, cookie, dữ liệu phiên, truy vấn cơ sở dữ liệu, các tuyến đường, trực quan hóa thời gian chạy ứng dụng và nhiều hơn nữa. Clockwork bao gồm hỗ trợ vượt trội cho các ứng dụng dựa trên Laravel 4 và Slim 2, bạn có thể thêm hỗ trợ cho bất kỳ khung hoặc tùy chỉnh nào khác thông qua API mở rộng.

nhập mô tả hình ảnh ở đây


16

Vì trình lược tả chưa xuất hiện trong Laravel 4 , tôi đã tạo hàm trợ giúp này để xem SQL được tạo:

    hàm tĩnh công khai q ($ all = true) 
    {
        $ truy vấn = DB :: getQueryLog ();

        if ($ tất cả == sai) {
            $ last_query = end ($ truy vấn);
            trả lại $ last_query;
        }

        trả về $ truy vấn;
    }

LƯU Ý : Đặt cờ $ all thành false nếu bạn chỉ muốn truy vấn SQL cuối cùng.

Tôi giữ loại chức năng này trong một lớp gọi là DBH.php (viết tắt của Trình trợ giúp cơ sở dữ liệu) để tôi có thể gọi nó từ bất cứ nơi nào như thế này:

dd(DBH::q()); 

Đây là đầu ra tôi nhận được: nhập mô tả hình ảnh ở đây

Trong trường hợp bạn đang tự hỏi, tôi sử dụng Kint cho định dạng dd (). http://raveren.github.io/kint/


1
if($all == false)? Tại sao không đơn giảnif(!$all)
toesslab 22/2/2016


14

Đây là một đoạn mã Javascript nhanh mà bạn có thể đưa lên mẫu trang chính của mình. Miễn là nó được bao gồm, tất cả các truy vấn sẽ được xuất ra Bảng điều khiển Javascript của trình duyệt của bạn. Nó in chúng trong một danh sách dễ đọc, giúp dễ dàng duyệt qua trang web của bạn và xem những truy vấn nào đang thực hiện trên mỗi trang.

Khi bạn gỡ lỗi xong, chỉ cần xóa nó khỏi mẫu của bạn.

<script type="text/javascript">
    var queries = {{ json_encode(DB::getQueryLog()) }};
    console.log('/****************************** Database Queries ******************************/');
    console.log(' ');
    queries.forEach(function(query) {
        console.log('   ' + query.time + ' | ' + query.query + ' | ' + query.bindings[0]);
    });
    console.log(' ');
    console.log('/****************************** End Queries ***********************************/');
</script>

Tôi nghĩ rằng bạn sẽ cần "" xung quanh phần {{json_encode ...}}
mydoglixu

@mydoglixu Vì DB::getQueryLog()trả về một mảng, không cần phải bao quanh nó bằng "". json_encodesẽ dịch nó cho phù hợp.
rmobis

@mobis - Ý tôi là bạn cần "" bên ngoài {{...}} để javascript không bị lỗi. như thế này: var query = "json output";
mydoglixu

@mydoglixu Bạn không, vì một mảng JSON (hoặc đối tượng) là JavaScript hợp lệ. Nó sẽ phá vỡ nếu bạn đã làm.
rmobis

@mobis - oh yeah, duh
mydoglixu 7/07/2015

10

Ấu trùng 5

Lưu ý rằng đây là cách tiếp cận theo thủ tục mà tôi sử dụng để gỡ lỗi nhanh

    DB::enableQueryLog();

    // Run your queries
    // ...

    // Then to retrieve everything since you enabled the logging:
    $queries = DB::getQueryLog();
    foreach($queries as $i=>$query)
    {
        Log::debug("Query $i: " . json_encode($query));
    }

trong tiêu đề của bạn, sử dụng:

     use DB;
     use Illuminate\Support\Facades\Log;

Đầu ra sẽ trông giống như thế này (tệp nhật ký mặc định là laravel.log ):

[2015-09-25 12:33:29] thử nghiệm , "thời gian": 0,23}

*** Tôi biết câu hỏi này được chỉ định Laravel 3/4 nhưng trang này xuất hiện khi tìm kiếm câu trả lời chung. Người mới sử dụng Laravel có thể không biết có sự khác biệt giữa các phiên bản. Vì tôi chưa bao giờ thấy DD::enableQueryLog()được đề cập trong bất kỳ câu trả lời nào tôi thường tìm thấy, nên nó thể cụ thể cho Laravel 5 - có lẽ ai đó có thể nhận xét về điều đó.


7

Bạn cũng có thể lắng nghe các sự kiện truy vấn bằng cách này:

DB::listen(function($sql, $bindings, $time)
{
    var_dump($sql);
});

Xem thông tin từ các tài liệu ở đây trong phần Nghe cho các sự kiện truy vấn


6

Sử dụng nhật ký truy vấn không cung cấp cho bạn truy vấn RAW thực tế đang được thực thi, đặc biệt nếu có các giá trị ràng buộc. Đây là cách tiếp cận tốt nhất để có được sql thô:

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

hoặc tham gia nhiều hơn:

$query = Article::whereIn('author_id', [1,2,3])->orderBy('published', 'desc')->toSql();
dd($query);

5

Nếu bạn đang sử dụng Laravel 5, bạn cần chèn phần này trước khi truy vấn hoặc trên phần mềm trung gian:

\DB::enableQueryLog();


3

trong Laravel 4, bạn thực sự có thể sử dụng Trình lắng nghe sự kiện cho các truy vấn cơ sở dữ liệu.

Event::listen('illuminate.query', function($sql, $bindings)
{
    foreach ($bindings as $val) {
        $sql = preg_replace('/\?/', "'{$val}'", $sql, 1);
    }

    Log::info($sql);
});

Đặt đoạn mã này ở bất cứ đâu, ví dụ như trong start/global.php. Nó sẽ viết các truy vấn vào nhật ký thông tin ( storage/log/laravel.log).


3
Event::listen('illuminate.query', function($sql, $param)
{
    \Log::info($sql . ", with[" . join(',', $param) ."]<br>\n");
});

đặt nó trong global.php nó sẽ ghi lại truy vấn sql của bạn.


2

Trình hồ sơ SQL Loic Sharma không hỗ trợ Laravel 4, tôi mới cài đặt nó. Các hướng dẫn được liệt kê ở đây . Các bước như sau:

  1. Thêm "loic-sharma/profiler": "1.1.*"vào phần yêu cầu trong composer.json
  2. Thực hiện tự cập nhật => php composer.phar self-updatetrong bảng điều khiển.
  3. Thực hiện cập nhật trình soạn thảo => php composer.phar update loic-sharma/profilertrong bảng điều khiển cũng `
  4. Thêm 'Profiler\ProfilerServiceProvider',vào mảng nhà cung cấp trong app.php
  5. Thêm 'Profiler' => 'Profiler\Facades\Profiler',vào mảng aliasses trong app.php là tốt
  6. Chạy php artisan config:publish loic-sharma/profilertrong bàn điều khiển

2

Truy vấn cuối cùng

$queries = \DB::getQueryLog();
$last_query = end($queries);

// Add binding to query
foreach ($last_query['bindings'] as $val) {
        $last_query['query'] = preg_replace('/\?/', "'{$val}'", $last_query['query'], 1);
}
dd($last_query);


0

Ấu trùng 3

Một cách khác để làm điều này là:

#config/database.php

'profiler' => true

Đối với tất cả các kết quả Truy vấn:

print_r(DB::profiler());

Đối với kết quả cuối cùng:

print_r(DB::last_query());

0

Để có được truy vấn được thực hiện cuối cùng trong laravel, Chúng tôi sẽ sử dụng DB::getQueryLog()chức năng của laravel, nó trả về tất cả các truy vấn đã thực hiện. Để có được truy vấn cuối cùng, chúng ta sẽ sử dụng end()hàm trả về truy vấn được thực hiện cuối cùng.

$student = DB::table('student')->get();
$query = DB::getQueryLog();
$lastQuery = end($query);
print_r($lastQuery);

Tôi đã lấy tài liệu tham khảo từ http://www.tutsway.com/how-to-get-the-last-executed-query-in-laravel.php .


Câu trả lời của bạn dường như không đóng góp bất kỳ kiến ​​thức mới nào cho câu trả lời được chấp nhận bởi Raphael_ đã bao gồm.
Jaak Kütt

0

Có một cách rất dễ dàng để làm điều đó, từ truy vấn laravel của bạn chỉ cần đổi tên bất kỳ tên cột nào, nó sẽ hiển thị cho bạn một lỗi với truy vấn của bạn .. :)


Cách hack nhanh chóng. Không hữu ích trong sản xuất, nhưng trong chế độ phát triển, nó vẫn ổn trong một số trường hợp.
thay vì
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.