Laravel 3/4 में प्राप्त क्वेरी प्राप्त करें


182

मैं लारवेल क्वेरी बिल्डर या एलोक्वि ओआरएम का उपयोग करके लारवेल 3/4 में कच्ची निष्पादित SQL क्वेरी कैसे प्राप्त कर सकता हूं?

उदाहरण के लिए, कुछ इस तरह:

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

या:

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

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

अन्यथा, बहुत कम से कम मैं कैसे लारवेल.ग्लॉग को निष्पादित सभी प्रश्नों को बचा सकता हूं?


लार्वा 5 में क्या है?
चौधरी वकास

जवाबों:


318

लारावेल 4+

Laravel 4 और बाद में, आपको DB::getQueryLog()सभी भागे हुए प्रश्नों को प्राप्त करने के लिए कॉल करना होगा।

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

या आप एक प्रोफाइलर पैकेज डाउनलोड कर सकते हैं। मैं बृजवृक्ष / लार्वा-डिबगबर की सिफारिश करूंगा , जो बहुत साफ-सुथरा है। आप उनके भंडार में कैसे स्थापित करें, इस बारे में निर्देशों के लिए पढ़ सकते हैं ।

Laravel 5 उपयोगकर्ताओं के लिए ध्यान दें:DB::enableQueryLog() क्वेरी निष्पादित करने से पहले आपको कॉल करना होगा । या तो लाइन के ऊपर जो क्वेरी को चलाता है या एक मिडलवेयर के अंदर।


लारवेल ३

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
द्वितीया_

मेरा बुरा, सही तरीका है getQueryLog। अब निश्चित कर दिया। धन्यवाद!
rmobis

अजीब ... मुझे last_query मिलता है () क्वेरी ऑब्जेक्ट त्रुटि पर परिभाषित नहीं है। मैं सिर्फ एक अज्ञात एलक्विंट मॉडल पर कॉल कर रहा हूं।
आदित्य एमपी

1
लारवेल 3 के लिए यह वास्तव में DB :: last_query () है; आपको अपने एप्लिकेशन / config / database.php में सही 'प्रोफाइल' सेट करने की आवश्यकता है
Dan Smart

4
यह L4 पर एलोकेंट मॉडल के लिए काम नहीं करता है। जब मैं मॉडल :: खोज ($ id) निष्पादित करता हूं और DB :: getQueryLog () खाली सरणी देता हूं () करता हूं। किसी भी विचार कैसे एक आदर्श मॉडल के लिए प्रश्न प्राप्त करने के लिए?
अभिषेक

31

आप सेटिंग में लारावेल 3 में " प्रोफाइलर " को सक्षम कर सकते हैं

'profiler' => true,

अपने application/config/application.phpऔर मेंapplication/config/database.php

यह प्रत्येक पृष्ठ के नीचे एक बार को सक्षम करता है। इसकी विशेषताओं में से एक निष्पादित प्रश्नों को सूचीबद्ध कर रहा है और प्रत्येक को कितना समय लगा।

यहां छवि विवरण दर्ज करें


14
ध्यान दें कि लारवेल 4 में, प्रोफाइलर शामिल नहीं है, आपको इसे स्वयं स्थापित करना होगा (जैसे संगीतकार का उपयोग करके)। इस SO प्रश्न को देखें ।
द्वितीया_


24

वाक्पटु के लिए आप कर सकते हैं:

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

लेकिन आपको अपनी क्वेरी से "-> प्राप्त ()" भाग को निकालने की आवश्यकता है।


17

मैं लारवेल पैकेज https://github.com/itsgoingd/clockwork के साथ क्रोम एक्सटेंशन क्लॉकवर्क का उपयोग करने की सलाह दूंगा । इसे स्थापित करना और उपयोग करना आसान है।

घड़ी की कल PHP के विकास के लिए एक क्रोम एक्सटेंशन है, डेवलपर टूल को एक नए पैनल के साथ प्रदान करता है जो आपके PHP स्क्रिप्ट को डीबगिंग और प्रोफाइलिंग के लिए उपयोगी सभी प्रकार की जानकारी प्रदान करता है, जिसमें अनुरोध, हेडर, जीईटी और पोस्ट डेटा, कुकीज़, सत्र डेटा, डेटाबेस क्वेरी पर जानकारी शामिल है। मार्गों, आवेदन क्रम और अधिक का दृश्य। क्लॉकवर्क में लारावेल 4 और स्लिम 2 आधारित अनुप्रयोगों के लिए बॉक्स समर्थन शामिल है, आप किसी एक्स्टेंसिबल एपीआई के माध्यम से किसी अन्य या कस्टम फ्रेमवर्क के लिए समर्थन जोड़ सकते हैं।

यहां छवि विवरण दर्ज करें


16

चूंकि प्रोफाइलर अभी तक लारवेल 4 में नहीं है , इसलिए मैंने एसक्यूएल को उत्पन्न होते देखने के लिए यह सहायक कार्य बनाया है:

    सार्वजनिक स्थिर फ़ंक्शन q ($ सभी = सत्य) 
    {
        $ क्वेरीज़ = DB :: getQueryLog ();

        अगर ($ == असत्य) {
            $ last_query = end ($ क्वेरी);
            $ last_query पर लौटें;
        }

        $ प्रश्न वापस करें;
    }

नोट : यदि आप केवल अंतिम SQL क्वेरी चाहते हैं तो $ सभी ध्वज को गलत पर सेट करें ।

मैं इस प्रकार के कार्यों को DBH.php (डेटाबेस हेल्पर के लिए संक्षिप्त) नामक कक्षा में रखता हूं ताकि मैं इसे कहीं से भी कॉल कर सकूं:

dd(DBH::q()); 

यहाँ मैं प्राप्त उत्पादन है: यहां छवि विवरण दर्ज करें

यदि आप सोच रहे हैं, तो मैं dd () स्वरूपण के लिए Kint का उपयोग करता हूं। http://raveren.github.io/kint/


1
if($all == false)? सिर्फ क्यों नहींif(!$all)
toesslab


14

यहां एक त्वरित जावास्क्रिप्ट स्निपेट है जिसे आप अपने मास्टर पेज टेम्पलेट पर फेंक सकते हैं। जब तक यह शामिल है, सभी प्रश्न आपके ब्राउज़र के जावास्क्रिप्ट कंसोल में आउटपुट होंगे। यह उन्हें आसानी से पढ़ने योग्य सूची में प्रिंट करता है, जिससे आपकी साइट के चारों ओर ब्राउज़ करना सरल होता है और देखें कि प्रत्येक पृष्ठ पर कौन से प्रश्न निष्पादित हो रहे हैं।

जब आप डीबगिंग कर रहे हों, तो इसे अपने टेम्पलेट से हटा दें।

<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 क्वेरीज़ = "json आउटपुट";
mydoglixu

@mydoglixu आप नहीं, क्योंकि JSON सरणी (या ऑब्जेक्ट) मान्य जावास्क्रिप्ट है। अगर आप ऐसा करते तो यह टूट जाता।
rmobis

@ मोबिस - ओह यस, डुह
मयदोग्लिक्सु

10

लारवेल ५

ध्यान दें कि यह प्रक्रियात्मक दृष्टिकोण है, जिसका उपयोग मैं त्वरित डीबगिंग के लिए करता हूं

    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 है ):

[२०१५-०९ -२५: १२:३३:२ ९] परीक्षण। डबग: प्रश्न ०: "" क्वेरी ":" का चयन करें * 'उपयोगकर्ताओं' से जहां ('user_id' =?) "," बाइंडिंग ": [" 9 "] , "समय": 0.23}

*** मुझे पता है कि यह प्रश्न 3/4 लारवेल को निर्दिष्ट करता है लेकिन सामान्य उत्तर की खोज करते समय यह पृष्ठ सामने आता है। Laravel के लिए नए-नए संस्करणों को नहीं पता हो सकता है कि संस्करणों में अंतर है। चूँकि मैं कभी DD::enableQueryLog()भी उन उत्तरों में से किसी का भी उल्लेख नहीं करता, जो मुझे सामान्य रूप से मिलते हैं, यह Laravel 5 के लिए विशिष्ट हो सकता है - शायद कोई उस पर टिप्पणी कर सकता है।


7

आप इसका उपयोग करके क्वेरी घटनाओं के लिए भी सुन सकते हैं:

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

डॉक्युमेंट्स के बारे में यहाँ सुनकर क्वेरी इवेंट्स के तहत देखें


6

क्वेरी लॉग का उपयोग न करने से आपको वास्तविक 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::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 में डाल दें। यह आपकी sql क्वेरी को लॉग करेगा।


2

Loic Sharma SQL प्रोफाइलर Laravel 4 का समर्थन करता है, मैंने अभी इसे स्थापित किया है। निर्देश यहां सूचीबद्ध हैं । चरण निम्नलिखित हैं:

  1. कंपोज़र.जॉन "loic-sharma/profiler": "1.1.*"में आवश्यकता अनुभाग में जोड़ें
  2. php composer.phar self-updateकंसोल में सेल्फ-अपडेट => करें।
  3. php composer.phar update loic-sharma/profilerकंसोल में संगीतकार अद्यतन => साथ ही करें
  4. जोड़े 'Profiler\ProfilerServiceProvider',app.php में प्रदाता सरणी में
  5. 'Profiler' => 'Profiler\Facades\Profiler',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

लारवेल ३

ऐसा करने का एक और तरीका है:

#config/database.php

'profiler' => true

सभी प्रश्न परिणाम के लिए:

print_r(DB::profiler());

अंतिम परिणाम के लिए:

print_r(DB::last_query());

0

लारवेल में अंतिम निष्पादित क्वेरी प्राप्त करने के लिए, हम DB::getQueryLog()लार्वा के कार्य का उपयोग करेंगे, यह सभी निष्पादित प्रश्नों को लौटाएगा। अंतिम क्वेरी प्राप्त करने के लिए हम 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 से संदर्भ लिया है ।


आपका उत्तर राफेल_ द्वारा स्वीकृत उत्तर को पहले से ही कवर करने के लिए किसी भी नए ज्ञान का योगदान नहीं देता है।
जाक कुत्त

0

इसे करने का बहुत आसान तरीका है, आपकी लार्वा क्वेरी से किसी भी कॉलम का नाम बदलना, यह आपको इस क्वेरी के साथ एक त्रुटि दिखाएगा .. :)


जल्दी हैक करने का तरीका। उत्पादन में उपयोगी नहीं है, लेकिन विकास के मामले में यह कुछ मामलों में ठीक है।
बजाय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.