รับ Query Executioned ใน Laravel 3/4


182

ฉันจะดึงเคียวรี SQL ที่ถูกเรียกใช้งานดิบใน Laravel 3/4 โดยใช้ Laravel Query Builder หรือ Eloquent ORM ได้อย่างไร

ตัวอย่างเช่นสิ่งนี้:

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

หรือ:

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

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

มิฉะนั้นอย่างน้อยที่สุดฉันจะสามารถบันทึกคิวรีทั้งหมดที่ดำเนินการไปยัง laravel.log ได้อย่างไร


สิ่งที่เกี่ยวกับ laravel 5?
Chaudhry Waqas

คำตอบ:


318

Laravel 4+

ใน Laravel 4 และใหม่กว่าคุณจะต้องโทรDB::getQueryLog()หาเคียวรีที่รันทั้งหมด

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

หรือคุณสามารถดาวน์โหลดแพ็คเกจ profiler ฉันขอแนะนำbarryvdh / laravel-debugbarซึ่งค่อนข้างเรียบร้อย คุณสามารถอ่านคำแนะนำเกี่ยวกับวิธีการติดตั้งในของพวกเขาที่เก็บ

หมายเหตุสำหรับผู้ใช้ Laravel 5:คุณจะต้องโทรDB::enableQueryLog()ก่อนดำเนินการค้นหา ทั้งเหนือบรรทัดที่เรียกใช้แบบสอบถามหรือภายในมิดเดิลแวร์


Laravel 3

ใน Laravel 3 คุณสามารถรับคิวรี่ที่ถูกเรียกใช้งานล่าสุดจากEloquentโมเดลที่เรียกเมธอดสแตติกlast_queryบนDBคลาส

DB::last_query();

นี้ แต่คุณต้องเปิดการใช้งานตัวเลือกในprofiler application/config/database.phpอีกวิธีหนึ่งคือ @dualed ดังกล่าวเปิดใช้งานprofilerตัวเลือกในapplication/config/application.phpหรือโทรDB::profile()เพื่อรับแบบสอบถามทั้งหมดวิ่งในคำขอปัจจุบันและเวลาดำเนินการของพวกเขา


2
รหัสของคุณสำหรับ Laravel 4 ไม่ทำงาน ผมได้รับนี้ErrorException: คำเตือน: call_user_func_array()คาดว่า 1 พารามิเตอร์ที่จะโทรกลับที่ถูกต้องชั้นไม่ได้มีวิธีการIlluminate\Database\MySqlConnection getQueryList
duality_

getQueryLogที่ไม่ดีของผมวิธีที่ถูกต้องคือ แก้ไขทันที ขอบคุณ!
rmobis

แปลก ... ฉันได้รับ last_query () ไม่ได้ถูกกำหนดไว้ในข้อผิดพลาดวัตถุ Query ฉันแค่โทรหานางแบบ Eloquent ที่ไม่มีความแน่นอน
Aditya MP

1
สำหรับ Laravel 3 จริงๆแล้ว DB :: last_query (); คุณต้องตั้งค่า 'โปรไฟล์' เป็นจริงใน application / config / database.php
Dan Smart

4
ดูเหมือนจะใช้งานไม่ได้กับ Eloquent Model บน L4 เมื่อฉันรัน Model :: find ($ id) และดำเนินการ DB :: getQueryLog () ส่งคืนอาร์เรย์ว่างเปล่า () แนวคิดใดที่จะได้รับแบบสอบถามสำหรับ Eloquent Model?
Abishek

31

คุณสามารถเปิดใช้งาน " Profiler " ใน Laravel 3 ได้โดยการตั้งค่า

'profiler' => true,

ในตัวคุณapplication/config/application.phpและapplication/config/database.php

สิ่งนี้ช่วยให้แถบที่ด้านล่างของแต่ละหน้า หนึ่งในคุณสมบัติของมันคือการแสดงรายการคำค้นหาที่ดำเนินการและระยะเวลาที่ใช้ไป

ป้อนคำอธิบายรูปภาพที่นี่


14
โปรดทราบว่าใน Laravel 4 ไม่รวม Profiler คุณต้องติดตั้งด้วยตัวเอง (เช่นการใช้ผู้แต่ง) ดูคำถาม SOนี้
duality_

1
มันเป็นที่กล่าวถึงในคำตอบแรกที่นั่น
duality_

24

สำหรับฝีปากคุณสามารถทำ:

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

แต่คุณต้องลบส่วน "-> get ()" ออกจากข้อความค้นหาของคุณ


17

ฉันจะแนะนำให้ใช้ส่วนขยายของ Chrome ลานกับแพคเกจ Laravel https://github.com/itsgoingd/clockwork ง่ายต่อการติดตั้งและใช้งาน

Clockwork เป็นส่วนเสริมของ Chrome สำหรับการพัฒนา PHP ขยายเครื่องมือสำหรับนักพัฒนาด้วยพาเนลใหม่ที่ให้ข้อมูลทุกชนิดที่เป็นประโยชน์สำหรับการดีบักและทำโปรไฟล์สคริปต์ PHP ของคุณรวมถึงข้อมูลตามคำขอส่วนหัวข้อมูล GET และ POST คุกกี้ข้อมูลเซสชันแบบสอบถามฐานข้อมูล เส้นทางการแสดงผลแอปพลิเคชันรันไทม์และอื่น ๆ Clockwork รวมเอาการสนับสนุนกล่องสำหรับแอพพลิเคชั่นที่ใช้ Laravel 4 และ Slim 2 คุณสามารถเพิ่มการสนับสนุนสำหรับเฟรมเวิร์กอื่นหรือกำหนดเองผ่าน API ที่ขยายได้

ป้อนคำอธิบายรูปภาพที่นี่


16

เนื่องจากตัวสร้างโปรไฟล์ยังไม่ออกในLaravel 4ฉันได้สร้างฟังก์ชันตัวช่วยนี้เพื่อดู SQL ที่สร้าง:

    ฟังก์ชั่นคงที่สาธารณะ q ($ all = true) 
    {
        $ query = DB :: getQueryLog ();

        if ($ all == false) {
            $ last_query = end (คำสั่ง $);
            ส่งคืน $ last_query;
        }

        ส่งคืนการสืบค้น $;
    }

หมายเหตุ : การตั้งค่า$ ทั้งหมดธงเท็จถ้าคุณต้องการเพียงแบบสอบถาม SQL ที่ผ่านมา

ฉันเก็บฟังก์ชันประเภทนี้ไว้ในคลาสที่เรียกว่า DBH.php (ย่อมาจาก Database Helper) ดังนั้นฉันสามารถเรียกมันได้จากทุกที่เช่นนี้

dd(DBH::q()); 

นี่คือผลลัพธ์ที่ฉันได้รับ: ป้อนคำอธิบายรูปภาพที่นี่

ในกรณีที่คุณสงสัยฉันใช้ Kint สำหรับการจัดรูปแบบ dd () http://raveren.github.io/kint/


1
if($all == false)? ทำไมไม่ง่ายif(!$all)
toesslab


14

นี่คือข้อมูลโค้ด Javascript อย่างรวดเร็วที่คุณสามารถใช้กับเทมเพลตหน้าต้นแบบของคุณ ตราบใดที่มันถูกรวมไว้แบบสอบถามทั้งหมดจะถูกส่งออกไปยัง Javascript Console ของเบราว์เซอร์ของคุณ มันพิมพ์พวกเขาในรายการที่อ่านได้ง่ายทำให้ง่ายต่อการเรียกดูรอบ ๆ เว็บไซต์ของคุณและดูว่าแบบสอบถามใดกำลังดำเนินการในแต่ละหน้า

เมื่อคุณดีบักเสร็จแล้วให้ลบออกจากเทมเพลตของคุณ

<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>

ฉันคิดว่าคุณจะต้อง "" รอบส่วน {{json_encode ... }}
mydoglixu

@mydoglixu ตั้งแต่DB::getQueryLog()ส่งกลับอาร์เรย์ไม่จำเป็นต้องล้อมรอบด้วย "" json_encodeจะแปลตามนั้น
rmobis

@mobis - ฉันหมายถึงคุณต้องมี "" อยู่นอก {{... }} เพื่อที่จาวาสคริปต์จะไม่ผิดพลาด ดังนี้: var query = "json output";
mydoglixu

@mydoglixu คุณทำไม่ได้เพราะอาร์เรย์ JSON (หรือวัตถุ) เป็น JavaScript ที่ถูกต้อง มันจะพังถ้าคุณทำ
rmobis

@mobis - oh yeah, duh
mydoglixu

10

Laravel 5

โปรดทราบว่านี่เป็นวิธีการตามขั้นตอนที่ฉันใช้สำหรับการดีบักอย่างรวดเร็ว

    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));
    }

ในส่วนหัวของคุณใช้:

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

ผลลัพธ์จะมีลักษณะดังนี้ (ไฟล์บันทึกเริ่มต้นคือlaravel.log ):

[2015-09-25 12:33:29] test.DEBUG: แบบสอบถาม 0: {"แบบสอบถาม": "เลือก * จาก 'ผู้ใช้' โดยที่ ('user_id' =?)", "การผูก": ["9"] "เวลา": 0.23}

*** ฉันรู้ว่าคำถามนี้ระบุ Laravel 3/4 แต่หน้านี้เกิดขึ้นเมื่อค้นหาคำตอบทั่วไป Newbies to Laravel อาจไม่ทราบว่ามีความแตกต่างระหว่างเวอร์ชัน เนื่องจากฉันไม่เคยเห็นที่DD::enableQueryLog()กล่าวถึงในคำตอบใด ๆ ที่ฉันพบตามปกติอาจเป็นเรื่องเฉพาะของ Laravel 5 - บางทีบางคนสามารถแสดงความคิดเห็นได้


7

นอกจากนี้คุณยังสามารถฟังกิจกรรมการสืบค้นโดยใช้สิ่งนี้:

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

ดูข้อมูลจากเอกสารที่นี่ภายใต้การฟังเพื่อค้นหาเหตุการณ์


6

การใช้บันทึกแบบสอบถามไม่ได้ให้คุณเรียกใช้แบบสอบถาม RAW ที่แท้จริงโดยเฉพาะอย่างยิ่งหากมีค่าที่ถูกผูกไว้ นี่เป็นวิธีที่ดีที่สุดในการรับ sql raw:

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

หรือมากกว่าที่เกี่ยวข้อง:

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

5

หากคุณกำลังใช้ Laravel 5 คุณต้องแทรกสิ่งนี้ก่อนการสืบค้นหรือบนมิดเดิลแวร์:

\DB::enableQueryLog();


3

ใน Laravel 4 คุณสามารถใช้ Event Listener สำหรับการสืบค้นฐานข้อมูล

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

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

start/global.phpสถานที่ใดก็ได้ตัวอย่างข้อมูลนี้เช่นใน มันจะเขียนแบบสอบถามลงในบันทึกข้อมูล ( storage/log/laravel.log)


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

ใส่ไว้ใน global.php มันจะเข้าสู่ระบบแบบสอบถาม SQL ของคุณ


2

ผู้สร้างโปรไฟล์ Loic Sharma SQL ไม่สนับสนุน Laravel 4 ฉันเพิ่งติดตั้ง คำแนะนำในการอยู่ที่นี่ ขั้นตอนดังต่อไปนี้:

  1. เพิ่ม "loic-sharma/profiler": "1.1.*"ในส่วนจำเป็นต้องใช้ใน composer.json
  2. ดำเนินการ self-update => php composer.phar self-updateในคอนโซล
  3. ทำการอัพเดทผู้แต่ง => php composer.phar update loic-sharma/profilerในคอนโซลเช่นกัน `
  4. เพิ่ม'Profiler\ProfilerServiceProvider',ในอาร์เรย์ผู้ให้บริการใน app.php
  5. เพิ่ม'Profiler' => 'Profiler\Facades\Profiler',ในอาร์เรย์ aliasses ใน app.php เช่นกัน
  6. ทำงานphp artisan config:publish loic-sharma/profilerในคอนโซล

2

พิมพ์แบบสอบถามล่าสุด

$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

Laravel 3

อีกวิธีในการทำเช่นนี้คือ:

#config/database.php

'profiler' => true

สำหรับผลการค้นหาทั้งหมด:

print_r(DB::profiler());

สำหรับผลลัพธ์ล่าสุด:

print_r(DB::last_query());

0

ในการรับแบบสอบถามที่ถูกประมวลผลครั้งล่าสุดใน laravel เราจะใช้DB::getQueryLog()ฟังก์ชันของ laravel ซึ่งจะส่งคืนแบบสอบถามที่ถูกดำเนินการทั้งหมด ในการรับแบบสอบถามล่าสุดเราจะใช้end()ฟังก์ชันที่ส่งคืนแบบสอบถามที่ถูกประมวลผลครั้งสุดท้าย

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

ฉันได้นำการอ้างอิงจากhttp://www.tutsway.com/how-to-get-the-last-executed-query-in-laravel.php


ดูเหมือนว่าคำตอบของคุณจะไม่สนับสนุนความรู้ใหม่ ๆ กับสิ่งที่คำตอบที่ยอมรับโดย Raphael_ ครอบคลุมอยู่แล้ว
Jaak Kütt

0

มีวิธีที่ง่ายมากที่จะทำจากแบบสอบถาม laravel ของคุณเพียงแค่เปลี่ยนชื่อคอลัมน์ใด ๆ ก็จะแสดงข้อผิดพลาดกับแบบสอบถามของคุณ .. :)


วิธีแฮ็คด่วน ไม่เป็นประโยชน์ในการผลิต แต่ในโหมดการพัฒนามันใช้ได้ในบางกรณี
แทน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.