ক্যারিটি লারাভেল 3/4 এ কার্যকর করা পান


182

লারাভেল কোয়েরি বিল্ডার বা স্বতন্ত্র ওআরএম ব্যবহার করে আমি কীভাবে লারাভেল 3/4 এ কাঁচা কার্যকর এসকিউএল কোয়েরিটি পুনরুদ্ধার করতে পারি?

উদাহরণস্বরূপ, এর মতো কিছু:

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

বা:

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

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

অন্যথায়, খুব কমপক্ষে আমি কীভাবে লারাভেল.লগের সাথে চালিত সমস্ত প্রশ্নগুলি সংরক্ষণ করতে পারি?


লারাভেল 5 এ কী হবে?
চৌধুরী চৌধুরী ওয়াকাস

উত্তর:


318

লারাভেল 4+

লারাভেল 4 এবং তারপরে, আপনাকে DB::getQueryLog()সমস্ত রান কোয়েরি পেতে কল করতে হবে।

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

অথবা আপনি প্রোফাইল প্যাকেজ ডাউনলোড করতে পারেন। আমি ব্যারিভিএডি / লারাভেল-ডিবাগবারের সুপারিশ করব যা বেশ ঝরঝরে। আপনি কীভাবে তাদের সংগ্রহস্থলে ইনস্টল করবেন সে সম্পর্কে নির্দেশাবলী পড়তে পারেন ।

লারাভেল 5 ব্যবহারকারীর জন্য দ্রষ্টব্য:DB::enableQueryLog() কোয়েরি চালানোর আগে আপনাকে কল করতে হবে । হয় ক্যারিটি চালিত রেখার ঠিক উপরে বা মিডওয়্যারের ভিতরে inside


লারাভেল ঘ

Laravel 3, আপনি একটি থেকে শেষ মৃত্যুদন্ড কার্যকর ক্যোয়ারী পেতে পারেন Eloquentমডেল স্ট্যাটিক পদ্ধতি কলিং last_queryউপর DBবর্গ।

DB::last_query();

তবে এটির জন্য আপনাকে profilerবিকল্পটি সক্রিয় করতে হবে application/config/database.php। বিকল্প হিসাবে আপনি, যেমন @ ছোট হিসাবে উল্লেখ করেছেন, profilerবিকল্পটি সক্ষম করতে application/config/application.phpবা DB::profile()সমস্ত অনুরোধটি বর্তমান অনুরোধে এবং তার প্রয়োগের সময়টিতে চালিত হওয়ার জন্য কল করতে পারে।


2
লারাভেল 4 এর জন্য আপনার কোড কাজ করে না। আমি এটি পেয়েছি ErrorException: সতর্কতা: call_user_func_array()প্যারামিটার 1টি একটি বৈধ কলব্যাক হিসাবে প্রত্যাশা Illuminate\Database\MySqlConnectionকরে , শ্রেণীর কোনও পদ্ধতি নেই getQueryList
দ্বৈততা_

আমার খারাপ, সঠিক পদ্ধতি getQueryLog। এটি এখনই স্থির করুন। ধন্যবাদ!
rmobis

অদ্ভুত ... আমি শেষ_ ক্যোয়ারী পাই () কোয়েরি অবজেক্ট ত্রুটিতে সংজ্ঞায়িত করা হয়নি। আমি কেবল একটি অনিচ্ছাকৃত স্বতন্ত্র মডেলকে কল করছি।
আদিত্য এমপি

1
লারাভেল 3 এর জন্য এটি আসলে ডিবি :: শেষ_কোয়ারি (); আপনার অ্যাপ্লিকেশন / কনফিগারেশন /
ড্যান স্মার্ট

4
এটি এল 4-তে কোনও স্পষ্ট মডেলটির জন্য কাজ করছে বলে মনে হচ্ছে না। আমি যখন মডেলটি নির্বাহ করি :: সন্ধান করুন ($ আইডি) এবং ডিবি সম্পাদন করুন :: getQueryLog () ফাঁকা অ্যারে () ফেরত দিন। কোনও বুদ্ধিমান মডেলটির জন্য কীভাবে প্রশ্নগুলি পাবেন?
অভিষেক

31

আপনি সেট করে লারাভেল 3 এ " প্রোফাইলার " সক্ষম করতে পারবেন

'profiler' => true,

আপনার application/config/application.phpএবংapplication/config/database.php

এটি প্রতিটি পৃষ্ঠার নীচে একটি বার সক্ষম করে। এর বৈশিষ্ট্যগুলির মধ্যে একটি হ'ল মৃত্যুদন্ডপ্রাপ্ত ক্যোয়ারীগুলি তালিকাভুক্ত করা এবং প্রতিটি প্রত্যেকে কতক্ষণ সময় নিয়েছিল।

এখানে চিত্র বর্ণনা লিখুন


14
নোট করুন যে লারাভেল 4-এ, প্রোফাইলার অন্তর্ভুক্ত নেই, আপনাকে নিজের দ্বারা এটি ইনস্টল করতে হবে (উদাহরণস্বরূপ সুরকার ব্যবহার করে)। দেখুন এই তাই প্রশ্ন
দ্বৈততা_

1
এটি সেখানে প্রথম উত্তরে আলোচনা করা হয়েছে ।
দ্বৈততা

24

স্বতঃস্ফূর্ত জন্য আপনি কেবল এটি করতে পারেন:

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

তবে আপনার ক্যোয়ারী থেকে আপনার "-> get ()" অংশটি সরিয়ে ফেলতে হবে।


17

আমি লারাভেল প্যাকেজ https://github.com/itsddddddclavers সাথে ক্রোম এক্সটেনশন ক্লকওয়ার্ক ব্যবহার করার পরামর্শ দেব । এটি ইনস্টল এবং ব্যবহার করা সহজ।

ক্লকওয়ার্ক হ'ল পিএইচপি বিকাশের জন্য ক্রোম এক্সটেনশান, বিকাশকারী সরঞ্জামগুলির প্রসারিত একটি নতুন প্যানেল যা আপনার পিএইচপি স্ক্রিপ্টগুলিতে ডিবাগিং এবং প্রোফাইলিংয়ের জন্য দরকারী সমস্ত ধরণের তথ্য সরবরাহ করে, অনুরোধ, শিরোনাম, জিইটি এবং পোষ্ট ডেটা, কুকিজ, সেশন ডেটা, ডাটাবেস প্রশ্নগুলি, রুট, অ্যাপ্লিকেশন রানটাইমের দৃশ্যায়ন এবং আরও অনেক কিছু। ক্লার্কওয়ার্কে লারাভেল 4 এবং স্লিম 2 ভিত্তিক অ্যাপ্লিকেশনগুলির জন্য বক্স সমর্থন অন্তর্ভুক্ত রয়েছে, আপনি কোনও এক্সটেনসিবল এপিআইয়ের মাধ্যমে অন্য কোনও বা কাস্টম কাঠামোর জন্য সমর্থন যুক্ত করতে পারেন।

এখানে চিত্র বর্ণনা লিখুন


16

যেহেতু প্রোফাইলারটি এখনও বাইরে নেই লারাভেল 4 এ , তাই এসকিউএল তৈরি হচ্ছে তা দেখার জন্য আমি এই সহায়ক ফাংশনটি তৈরি করেছি:

    পাবলিক স্ট্যাটিক ফাংশন q (সমস্ত = সত্য) 
    {
        eries প্রশ্নগুলি = ডিবি :: getQueryLog ();

        যদি ($ সব == মিথ্যা) {
            $ শেষ_ প্রশ্ন = শেষ (eries কোয়েরি);
            প্রত্যাবর্তন $ সর্বশেষ_কোয়ারি;
        }

        প্রত্যাবর্তন $ প্রশ্নসমূহ;
    }

দ্রষ্টব্য : আপনি কেবলমাত্র শেষ এসকিউএল কোয়েরিটি চাইলে flag সমস্ত পতাকাটিকে মিথ্যাতে সেট করুন ।

আমি এই ধরণের ফাংশনগুলি DBH.php (ডেটাবেস হেল্পারের জন্য সংক্ষিপ্ত) নামে ক্লাসে রাখি যাতে আমি এখান থেকে যেকোন স্থান থেকে কল করতে পারি:

dd(DBH::q()); 

আমি প্রাপ্ত আউটপুট এখানে: এখানে চিত্র বর্ণনা লিখুন

আপনি যদি ভাবছেন তবে আমি ডিডি () ফর্ম্যাটিংয়ের জন্য কিন্ট ব্যবহার করব। http://raveren.github.io/kint/


1
if($all == false)? কেন সহজভাবে নয়if(!$all)
নভেম্বর 16'8


14

এখানে একটি দ্রুত জাভাস্ক্রিপ্ট স্নিপেট আপনি নিজের মাস্টার পৃষ্ঠার টেম্পলেটটিতে ফেলতে পারেন। যতক্ষণ এটি অন্তর্ভুক্ত থাকবে ততক্ষণ সমস্ত প্রশ্ন আপনার ব্রাউজারের জাভাস্ক্রিপ্ট কনসোলের আউটপুট হবে। এটি সহজেই পঠনযোগ্য তালিকায় এগুলি প্রিন্ট করে, আপনার সাইটের চারপাশে ব্রাউজ করা সহজ করে তোলে এবং প্রতিটি পৃষ্ঠায় কী জিজ্ঞাসাগুলি কার্যকর করছে তা দেখুন।

আপনার ডিবাগিং হয়ে গেলে, কেবল এটি আপনার টেম্পলেট থেকে সরান remove

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

আমার মনে হয় আপনার "" জেএসন_নকোড ...}} অংশ
mydoglixu

@mydoglixu যেহেতু DB::getQueryLog()একটি অ্যারে ফিরিয়েছে, তাই এটিকে ঘিরে "" দরকার নেই। json_encodeএটি অনুসারে অনুবাদ করা হবে।
rmobis

@ মোবিস - আমি বোঝাতে চাইছি যে আপনার "" {{...}} এর বাইরে "দরকার যাতে জাভাস্ক্রিপ্ট কোনও ত্রুটি না ফেলে। এটির মতো: var কোয়েরি = "জসন আউটপুট";
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;

আউটপুটটি এরকম কিছু দেখবে (ডিফল্ট লগ ফাইলটি লারাভেল.লগ ):

[2015-09-25 12:33:29] টেস্টিং.ডিইউবিজি: কোয়েরি 0: {"ক্যোয়ারী": "'ব্যবহারকারী' থেকে * নির্বাচন করুন যেখানে ('ব্যবহারকার_আইডি' =?)", "বাইন্ডিংস": ["9"] , "সময়": 0.23}

*** আমি জানি এই প্রশ্নটি লারাভেল 3/4 নির্দিষ্ট করা আছে তবে একটি সাধারণ উত্তর অনুসন্ধান করার সময় এই পৃষ্ঠাটি উঠে আসে। লারাভেলের Newbies হয়ত জানেন না যে সংস্করণগুলির মধ্যে পার্থক্য রয়েছে। যেহেতু আমি DD::enableQueryLog()সাধারণত আমি যে উত্তরগুলির উত্তর পাই তা কখনই উল্লেখ করি না , এটি লারাভেল 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

যদি আপনি লারাভেল 5 ব্যবহার করে থাকেন তবে আপনার প্রশ্নের আগে বা মিডলওয়্যারটিতে এটি সন্নিবেশ করা দরকার:

\DB::enableQueryLog();


3

লারাভেল ৪-এ আপনি ডাটাবেস প্রশ্নের জন্য একটি ইভেন্ট শ্রোতা ব্যবহার করতে পারেন।

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 এ রাখুন এটি আপনার এসকিএল কোয়েরি লগ করবে।


2

লিক শর্মা এসকিউএল প্রোফাইলার লারাভেল 4 সমর্থন করে, আমি এটি কেবল ইনস্টল করেছি। নির্দেশাবলী এখানে তালিকাভুক্ত করা হয় । পদক্ষেপগুলি নিম্নলিখিত:

  1. যোগ "loic-sharma/profiler": "1.1.*"composer.json অধ্যায় প্রয়োজন মধ্যে
  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 মধ্যে aliasses অ্যারের মধ্যে পাশাপাশি
  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-executes-query-in-laravel.php থেকে রেফারেন্স নিয়েছি ।


আপনার উত্তরটি রাফেল_-এর গৃহীত উত্তরটি ইতিমধ্যে কভার করে তাতে কোনও নতুন জ্ঞানের অবদান রয়েছে বলে মনে হয় না।
জাক ক্যাট

0

এটি করার খুব সহজ উপায় আছে, আপনার লারাভেল ক্যোয়ারী থেকে কেবল কোনও কলামের নাম পরিবর্তন করুন, এটি আপনাকে আপনার প্রশ্নের সাথে একটি ত্রুটি দেখাবে .. :)


দ্রুত হ্যাকি উপায়। উত্পাদনে দরকারী নয়, তবে উন্নয়ন মোডে কিছু ক্ষেত্রে এটি ঠিক আছে।
পরিবর্তে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.