স্ট্রিং হিসাবে এর কাঁচা এসকিউএল ক্যোয়ারী আউটপুট করতে কীভাবে আমি বিল্ডার পেতে পারি?


544

নিম্নলিখিত কোড দেওয়া:

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

আমি কাঁচা এসকিউএল কোয়েরি স্ট্রিং পেতে চাই যা উপরের ডাটাবেস ক্যোয়ারী বিল্ডার উত্পন্ন করবে। এই উদাহরণে, এটি হবে SELECT * FROM users

আমি এটা কিভাবে করবো?


14
লারাভেল সুস্পষ্ট ওআরএম কাঁচা ক্যোয়ারী পান:echo User::where('status', 1)->toSql();
মুহাম্মদ শাহজাদ

আমি ল্যারাভেল - টেলিস্কোপের জন্য একটি প্যাকেট ব্যবহার করছি, এটি সমস্ত প্রশ্নের লগ করে এবং আরও অনেক কিছুই করে।
ভিনসা

উত্তর:


658

স্ক্রিনে আউটপুট দেওয়ার জন্য শেষ ক্যোয়ারী ছুটে গেছে আপনি এটি ব্যবহার করতে পারেন:

DB::enableQueryLog(); // Enable query log

// Your Eloquent query executed by using get()

dd(DB::getQueryLog()); // Show results of log

আমি বিশ্বাস করি যে সর্বাধিক সাম্প্রতিক অনুসন্ধানগুলি অ্যারের নীচে থাকবে।

আপনার এমন কিছু হবে:

array(1) {
  [0]=>
  array(3) {
    ["query"]=>
    string(21) "select * from "users""
    ["bindings"]=>
    array(0) {
    }
    ["time"]=>
    string(4) "0.92"
  }
}

( নীচে জোশুয়ার মন্তব্যের জন্য ধন্যবাদ ।)


2
হুম নিশ্চিত না তোমার কিন্তু আপনি কি আপনি চান accompish করার জন্য একটি সুরকার প্যাকেজের সাথে সক্ষম হতে পারে stackoverflow.com/a/17339752/813181
jfortunato

9
Logক্লাসটি ব্যবহার করে আপনার অ্যাপ্লিকেশনটির লগ এটিকে আউটপুট দেওয়া আরও ভাল হতে পারে : Log::debug(DB::getQueryLog())
মস্তুরি

35
এটি এখন ডিফল্টরূপে বন্ধ হওয়ায় আপনার এটি সক্ষম করার প্রয়োজন হতে পারে। আপনি এই আদেশটি সাময়িকভাবে চালু করতে ব্যবহার করতে পারেন:DB::enableQueryLog();
জোশুয়া ফ্রেঞ্চ

5
আমি আপনার উত্তর চেষ্টা করেছিলাম। আমি যা চেষ্টা করেছি তা DB::enableQueryLog(); dd(DB::getQueryLog());কিন্তু তা ফিরে আসে []....
আমি

6
আপনার যদি একাধিক ডাটাবেস থাকে, আপনার প্রয়োজন হতে পারেDB::connection('database')->getQueryLog()
ড্যামিয়েন Ó Ceallaigh

744

toSql()একটি QueryBuilderউদাহরণে পদ্ধতিটি ব্যবহার করুন ।

DB::table('users')->toSql() ফিরে আসবে:

from ব্যবহারকারীগণ থেকে * নির্বাচন করুন `

ইভেন্ট শ্রোতাদের ওয়্যারিংয়ের চেয়ে এটি আরও সহজ এবং আপনার তৈরির সময় কোয়েরিটি যে কোনও মুহুর্তে আসলে কেমন হবে তা আপনাকে পরীক্ষা করতে দেয়।


6
আমি মনে করি লারাভেলের বাইরে এলোভেনড ব্যবহার করার সময় এটি সবচেয়ে সহজ উপায়
গ্যাব

8
@ স্টটারমসন এটি সম্ভব নয় কারণ পিএইচপি-র কখনই তাদের মানগুলির সাথে প্রতিস্থাপনের সাথে কোয়েরি থাকে না। প্রশ্নগুলি সম্পূর্ণরূপে পেতে আপনাকে মাইএসকিউএল থেকে তাদের লগ করতে হবে। এখানে আরও তথ্য রয়েছে: stackoverflow.com/questions/1786322/…
ম্যাথু

40
@ স্টটারমসন আপনি getBindingsপদ্ধতিটি ব্যবহার করতে পারেন । এটি যাতে এসকিউএল স্টেটমেন্টের সাথে আবদ্ধ থাকবে সেগুলি যাতে এই বাইন্ডিংগুলি ফিরিয়ে দেয়।
ড্যানরনমুন

2
জটিল প্রশ্নগুলি ডিবাগ করার জন্য খুব সহায়ক যে বুদ্ধিমান লোকেরা ক্যোয়ারী লগটিতে প্রদর্শিত না হওয়ায় চালানো অস্বীকার করে।
ববচাও 87

33
Bindinds সঙ্গে ক্যোয়ারী পেতে$query = \DB::table('users')->where('id', 10); $sql = str_replace_array('?', $query->getBindings(), $query->toSql()); dd($sql);
Ennio সুসা

88

DB::QueryLog()আপনি কোয়েরি কার্যকর করার পরে কেবল কাজ করুন $builder->get()। আপনি যদি ক্যোয়ারী চালানোর আগে ক্যোয়ারী পেতে চান তবে আপনি $builder->toSql()পদ্ধতিটি ব্যবহার করতে পারেন । এটি এসকিএল পেতে এবং এটি আবদ্ধ করার উদাহরণ:

    $query = str_replace(array('?'), array('\'%s\''), $builder->toSql());
    $query = vsprintf($query, $builder->getBindings());
    dump($query);

    $result = $builder->get();

অথবা কেবল আপনার ক্যোয়ারী ত্রুটিযুক্ত করে নিন যেমন অ্যাসেক্সিস্ট টেবিল বা কলামটি কল করার জন্য, আপনি এক্সডি ব্যতীত উত্পন্ন উত্সটি দেখতে পাবেন


3
এটি এখন পর্যন্ত সর্বোত্তম উত্তর, সহজ এবং সরল বিন্দুতে। ধন্যবাদ :)
সোবাকাস

18
ওয়ান-লাইনার হিসাবে:$query = vsprintf(str_replace(array('?'), array('\'%s\''), $builder->toSql()), $builder->getBindings());
kramer65

এটি একটি স্থানীয় ফাংশন হিসাবে কাঠামোর মধ্যে অন্তর্ভুক্ত করা উচিত .. ধন্যবাদ
টম ম্লেজিভা

মনে রাখবেন যে আপনার কোয়েরিতে ইতিমধ্যে শতভাগ চিহ্ন রয়েছে যেমন কোনও LIKEপ্রশ্নের জন্য বা তারিখের ফর্ম্যাট করার সময় এটি কাজ করবে না Note দ্বিগুণ শতাংশের চিহ্ন সহ আপনাকে প্রথমে তাদের পালাতে হবে।
অজানা দেব

এটি করার সময় কি সুরক্ষা উদ্বেগ রয়েছে? বাইন্ডিংগুলি কি স্যানিটাইজড থেকে আসে $builder->getBindings()?
solidau

56

আপনি 'আলোকসজ্জা.কোয়ারি' ইভেন্টটি শুনতে পারেন। ক্যোয়ারির আগে নিম্নলিখিত ইভেন্ট শ্রোতাদের যুক্ত করুন:

Event::listen('illuminate.query', function($query, $params, $time, $conn) 
{ 
    dd(array($query, $params, $time, $conn));
});

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

এটি এমন কিছু মুদ্রণ করবে:

array(4) {
  [0]=>
  string(21) "select * from "users""
  [1]=>
  array(0) {
  }
  [2]=>
  string(4) "0.94"
  [3]=>
  string(6) "sqlite"
}

1
আমি অপরিজ্ঞাত পদ্ধতিতে কল পেয়েছি আলোকিত \ ডাটাবেস \ প্রশ্ন ery নির্মাতা :: শুনুন () লারাভেল 4
মিগুয়েল স্টিভেনস

2
ধন্যবাদ এই দুর্দান্ত। এটি উল্লেখ করা ভাল যে ডিডি একটি ফাংশন যা স্ক্রিপ্টের প্রদত্ত পরিবর্তনশীল এবং শেষ সম্পাদন এবং একটি ইভেন্ট আমদানি করার জন্য একটি ডাম্প উত্পাদন করে, অন্তর্ভুক্তuse Illuminate\Support\Facades\Event;
র‌্যাডটেক

1
@radtek: পরিবর্তে use Illuminate\Support\Facades\Event;আপনি কেবল কি করতে পারেন use Event;যেহেতু এটি একটি এর ছদ্মরূপ
TachyonVortex

50

আপনি যদি লারাভেল ব্যবহার ছাড়াই আলোকিত করে লগটি পেতে চেষ্টা করছেন:

\Illuminate\Database\Capsule\Manager::getQueryLog();

আপনি এর মতো দ্রুত কাজ করতে পারবেন:

function logger() {
    $queries = \Illuminate\Database\Capsule\Manager::getQueryLog();
    $formattedQueries = [];
    foreach( $queries as $query ) :
        $prep = $query['query'];
        foreach( $query['bindings'] as $binding ) :
            $prep = preg_replace("#\?#", is_numeric($binding) ? $binding : "'" . $binding . "'", $prep, 1);
        endforeach;
        $formattedQueries[] = $prep;
    endforeach;
    return $formattedQueries;
}

সম্পাদনা

আপডেট হওয়া সংস্করণগুলিতে ডিফল্টরূপে ক্যোয়ারী লগিং অক্ষম করা আছে বলে মনে হচ্ছে (উপরের অংশটি একটি খালি অ্যারে দেয়)। ফিরে যেতে, ক্যাপসুল ম্যানেজারটি শুরু করার সময়, সংযোগের একটি উদাহরণ ধরুন এবং enableQueryLogপদ্ধতিটি কল করুন

$capsule::connection()->enableQueryLog();

আবার সম্পাদনা করুন

আসল প্রশ্নটি বিবেচনায় নিয়ে আপনি পূর্ববর্তী সমস্ত প্রশ্নের পরিবর্তে বর্তমান একক ক্যোয়ারী রূপান্তর করতে নিম্নলিখিতটি করতে পারেন:

$sql = $query->toSql();
$bindings = $query->getBindings();

আমি "নাম = [name" নাম ":" রিফাত "query] ক্যোয়ারী থেকে এই ধরণের রিটার্ন পাচ্ছি কেবল" নাম = রিফাত "পেতে আমাকে কী করতে হবে?
শরীরী

আমি আপনার বাইন্ডিংগুলি মুদ্রণ করব, দেখে মনে হচ্ছে আপনি স্ট্রিংয়ের পরিবর্তে অ্যারে পাস করছেন
লুক স্নোডেন

এটি একটি সহায়ক শুরু, তবে প্যারামিটারাইজড মানগুলির কাছাকাছি একক উক্তি যুক্ত করা অবহেলা বলে মনে হচ্ছে যেমন আমি যখন স্ট্রিংটি পাস করি তখন 'US/Eastern'
রায়ান

1
@ রায়ান এটি সত্য তাই আমি কেন বলেছি quick function। আমি বিশ্বাস করি যে অন্তর্নিহিত কোডটি প্রস্তুতি ( php.net/manual/en/mysqli.prepare.php ) পদ্ধতি ব্যবহার করবে , এজন্য কেবল ?প্রয়োজন। আপনি একক উদ্ধৃতিতে ইনপুট সংযুক্ত করতে হবে কিনা তা নির্ধারণ করতে আপনি php.net/manual/en/function.is-numeric.php করতে পারেন।
লুক স্নোডেন

1
@ লুকস্নোডেন আপনার উত্তর প্রতিভা! আমি অবশেষে আপনার নতুন সংস্করণটি চেষ্টা করার জন্য সময় নিয়েছি (যা আমি আপনার is_numericধারণাটি অন্তর্ভুক্ত করার জন্য উপরে সম্পাদনা করেছি ) এবং এটি কার্যকর! আমি এটা ভালোবাসি. ধন্যবাদ.
রায়ান

36

ক্যোয়ারী স্ট্রিং পাওয়ার জন্য স্পষ্টভাবে একটি পদ্ধতি রয়েছে is

toSql ()

আমাদের ক্ষেত্রে,

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

প্রত্যাবর্তন

select * from users

এসকিউএল কোয়েরি স্ট্রিংটি ফেরত দেওয়ার সঠিক সমাধানটি..এই সহায়ক হ ...


11
কোয়েরি বাইন্ডিং সম্পর্কে কী? উদাহরণস্বরূপ আপনি যখন ->where('foo', '=', 'bar')
স্ক্যুলে

28
$data = User::toSql();
echo $data; //this will retrun select * from users. //here User is model

এটি অনেক বেশি সুনির্দিষ্ট, নিয়ন্ত্রিত এবং প্রশ্নের প্রয়োজনীয়তা পূরণ করে।
বেনজামিনহুল

আপনার মন্তব্যের জন্য ধন্যবাদ.
কুলদীপ মিশ্র

2
->toSql()যদি মডেলের পরে আরও যুক্তি থাকে তবে আপনি যেমন করতে পারেন তেমন সংযোজন করতে পারেন। উদাহরণস্বরূপUser::where('id', 1)->toSql()
টবি মেলর 16

24

যদি আপনি লারাভেল 5.1 এবং মাইএসকিউএল ব্যবহার করেন তবে আপনি আমার তৈরি এই ফাংশনটি ব্যবহার করতে পারেন:

/*
 *  returns SQL with values in it
 */
function getSql($model)
{
    $replace = function ($sql, $bindings)
    {
        $needle = '?';
        foreach ($bindings as $replace){
            $pos = strpos($sql, $needle);
            if ($pos !== false) {
                if (gettype($replace) === "string") {
                     $replace = ' "'.addslashes($replace).'" ';
                }
                $sql = substr_replace($sql, $replace, $pos, strlen($needle));
            }
        }
        return $sql;
    };
    $sql = $replace($model->toSql(), $model->getBindings());

    return $sql;
}

ইনপুট প্যারামিটার হিসাবে আপনি এগুলির দুটি ব্যবহার করতে পারেন

জ্বালান \ ডাটাবেস \ বলিয়ে \ নির্মাতা

জ্বালান \ ডাটাবেস \ বলিয়ে \ সম্পর্ক \ HasMany

জ্বালান \ ডাটাবেস \ ক্যোয়ারী \ নির্মাতা


মন্তব্যে করা সমস্ত মন্তব্য অন্তর্ভুক্ত করার জন্য উত্তরটির উন্নতি হয়েছে। আপনাকে অনেক ধন্যবাদ.
ইয়েভেগেনি আফানসিয়েভ

13

প্রথমে আপনাকে কল করে ক্যোয়ারী লগ সক্ষম করতে হবে:

DB::enableQueryLog();

ডিবি ফ্যাসাদ ব্যবহার করে প্রশ্নের পরে আপনি লিখতে পারেন:

dd(DB::getQueryLog());

আউটপুট নীচে পছন্দ করবে:

array:1 [▼
  0 => array:3 [▼
    "query" => "select * from `users` left join `website_user` on `users`.`id` = `website_user`.`user_id` left join `region_user` on `users`.`id` = `region_user`.`user_id` left ▶"
    "bindings" => array:5 [▶]
    "time" => 3.79
  ]
]

খুব সহায়ক উত্তর
অনুপ পিএস

হাই আমি $ ফলাফল = ডিবি ব্যবহার করেছি :: নির্বাচন করুন ('স্কয়ার্ট_উজার_মডিউলগুলি থেকে ব্যবহারকারী নির্বাচন করুন যেখানে ব্যবহারকারী_আইডি =: আইডি', ['আইডি' => $ ব্যবহারকারী]); ডিবি :: enableQueryLog (); তবে কোনও আউটপুট ডিডি (ডিবি :: getQueryLog ()) পান নি;
অনুপ পিএস

আমাদের কোনও গ্রন্থাগার অন্তর্ভুক্ত করা দরকার
আনুপ পিএস

1
পদক্ষেপ 1: ডিবি :: সক্ষম কুইলওগ (); পদক্ষেপ 2: $ ফলাফল = ডিবি :: নির্বাচন করুন ('স্কয়ার্ট_উজার_মডিউলগুলি থেকে ব্যবহারকারী নির্বাচন করুন যেখানে ব্যবহারকারী_আইডি =: আইডি', ['আইডি' => $ ব্যবহারকারী]); পদক্ষেপ 3: ডিডি (ডিবি :: getQueryLog ());
রবি মনে

12

এটি এখন পর্যন্ত সবচেয়ে ভাল সমাধান হ'ল আমি যে কোনও একটিকে ডিবাগ-ইন-ইলরোয়েন্ট শেষ কোয়েরি বা চূড়ান্ত ক্যোয়ারীর জন্য পরামর্শ দিতে পারি যদিও এটির পাশাপাশি আলোচনা করা হয়েছে:

// query builder
$query = DB::table('table_name')->where('id', 1);

// binding replaced
$sql = str_replace_array('?', $query->getBindings(), $query->toSql());

// for laravel 5.8^
$sql = Str::replaceArray('?', $query->getBindings(), $query->toSql());

// print
dd($sql);

10

প্রথম উপায়:

সহজভাবে আপনি toSql()পদ্ধতি ব্যবহার করে নিম্নলিখিত জিনিসগুলি করতে পারেন ,

$query = DB::table('users')->get();

echo $query->toSql();

এটা কাজ করছে না করে তাহলে আপনি এটি সেট আপ করতে পারেন থেকে জিনিস Laravel ডকুমেন্টেশন

দ্বিতীয় উপায়:

এটি করার আরেকটি উপায়

DB::getQueryLog()

কিন্তু এটি অক্ষম যদি এটা রিটার্ন একটি খালি অ্যারে ডিফল্টরূপে তারপর এর এই সফরের ,

শুধু সাথে সক্ষম করুন DB::enableQueryLog()এবং এটি কাজ করবে :)

আরও তথ্যের জন্য গিথুব ইস্যু সম্পর্কে আরও জানতে ভিজিট করুন ।

আশা করি এটা সাহায্য করবে :)


10

বাইন্ডিংগুলির সাথে এসকিউএল কোয়েরি পেতে একটি 'ম্যাক্রোয়েবল' প্রতিস্থাপন।

  1. পদ্ধতিতে ম্যাক্রো ফাংশন নীচে যুক্ত করুন ।AppServiceProvider boot()

    \Illuminate\Database\Query\Builder::macro('toRawSql', function(){
        return array_reduce($this->getBindings(), function($sql, $binding){
            return preg_replace('/\?/', is_numeric($binding) ? $binding : "'".$binding."'" , $sql, 1);
        }, $this->toSql());
    });
  2. সুস্পষ্ট বিল্ডারের জন্য একটি উপকরণ যুক্ত করুন। ( লারাভেল 5.4+ )

    \Illuminate\Database\Eloquent\Builder::macro('toRawSql', function(){
        return ($this->getQuery()->toRawSql());
    });
  3. তারপরে যথারীতি ডিবাগ করুন। ( লারাভেল 5.4+ )

    উদাহরণস্বরূপ কোয়েরি বিল্ডার

    \Log::debug(\DB::table('users')->limit(1)->toRawSql())

    উদাহরণস্বরূপ বুদ্ধিমান নির্মাতা

    \Log::debug(\App\User::limit(1)->toRawSql());

দ্রষ্টব্য: লারাভেল ৫.১ থেকে ৫.৩ অবধি, যেহেতু প্রচ্ছন্ন নির্মাতা Macroableবৈশিষ্ট্যটি ব্যবহার করেন না , toRawSqlতাই ফ্লাইয়ের প্রচ্ছন্ন নির্মাত্রে কোনও উপাধি যুক্ত করতে পারবেন না । এটি অর্জনের জন্য নীচের উদাহরণটি অনুসরণ করুন।

যেমন স্বতন্ত্র নির্মাতা ( লারাভেল 5.1 - 5.3 )

\Log::debug(\App\User::limit(1)->getQuery()->toRawSql());

উফফফ, আমি দেরি করে এসেছি। কেবল ম্যাক্রো ব্যবহার করে একটি উত্তর জমা দিতে চাই। এটি সর্বোত্তম উত্তর। গ্রহণযোগ্য উত্তর হওয়া উচিত: ডি
এনএমএফজোন

আপনি বেসটি
মডেলটির

8

ডিবাগবার প্যাকেজ ব্যবহার করুন

composer require "barryvdh/laravel-debugbar": "2.3.*"

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


7

ল্যারাভেল 5.2এবং পরবর্তী থেকে। আপনি DB::listenএক্সিকিউটড ক্যোয়ারী পেতে ব্যবহার করতে পারেন ।

DB::listen(function ($query) {
    // $query->sql
    // $query->bindings
    // $query->time
});

অথবা আপনি যদি কোনও একক Builderউদাহরণটি ডিবাগ করতে চান তবে আপনি toSqlপদ্ধতিটি ব্যবহার করতে পারেন ।

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

1
শোনার জিনিসটি কার্যকর, ক্যোয়ারী চালানোর আগে এটি ঘোষণা করুন এবং পদ্ধতিটির মধ্যে বর্গক্ষেত্র এবং বাইন্ডিংগুলি ফেলে দিন। অপূর্ণ কিন্তু অন্য উত্তরের চেয়ে দ্রুত / সহজ কাজ করে।
অ্যান্ড্রু

7

সর্বাধিক সহজ উপায় হ'ল ইচ্ছাকৃত ভুল করা । উদাহরণস্বরূপ, আমি নিম্নলিখিত সম্পর্কের সম্পূর্ণ এসকিউএল কোয়েরি দেখতে চাই:

 public function jobs()
        {
            return $this->belongsToMany(Job::class, 'eqtype_jobs')
                   ->withPivot(['created_at','updated_at','id'])
                   ->orderBy('pivot_created_at','desc');
        }

আমি কেবল একটি কলাম খুঁজে পাওয়া যায়নি তা তৈরি করতে, এখানে আমি বেছে created_atনিয়েছি এবং এটিতে created_atsট্রেলিং যুক্ত করে এটিতে পরিবর্তন করেছি s:

public function jobs()
            {
                return $this->belongsToMany(Job::class, 'eqtype_jobs')
                       ->withPivot(['created_ats','updated_at','id'])
                       ->orderBy('pivot_created_at','desc');
            }

সুতরাং, ডিবাগার নিম্নলিখিত ত্রুটিটি ফিরিয়ে দেবে:

(4/4) ত্রুটিগ্রাহ্য এসকিউএলসেট [42 এস 22]: কলামটি পাওয়া যায় নি: 1054 অজানা কলাম 'eqtype_jobs.created_ats' 'ক্ষেত্রের তালিকায়' (এসকিউএল: নির্বাচন করুন jobs। * eqtype_jobs,। set_idহিসাবেpivot_set_id , eqtype_jobsjob_idযেমন pivot_job_id, eqtype_jobscreated_ats যেমন pivot_created_ats, eqtype_jobsupdated_atযেমন pivot_updated_at, eqtype_jobsidযেমন pivot_idথেকে jobsঅভ্যন্তরীণ যোগদান eqtype_jobsকরুন jobsid= eqtype_jobsjob_idযেখানে eqtype_jobsset_id= 56 ডেস্ক pivot_created_atসীমা 20 অফসেট 0 অর্ডার দিয়ে ) (দেখুন: /home/said/www/factory/resources/views/set/show.blade.php)

উপরের ত্রুটি বার্তাটি ভুল সহ পুরো এসকিউএল কোয়েরিটি প্রদান করে

SQL: select  jobs.*, eqtype_jobs.set_id as pivot_set_id,  eqtype_jobs.job_id as pivot_job_id, eqtype_jobs.created_ats as pivot_created_ats, eqtype_jobs.updated_at as  pivot_updated_at, eqtype_jobs.id as pivot_id from jobs inner join eqtype_jobs on jobs.id = eqtype_jobs.job_id where  eqtype_jobs.set_id = 56 order by pivot_created_at desc limit 20 offset 0

এখন, কেবল sতৈরি_এট থেকে অতিরিক্ত সরিয়ে ফেলুন এবং এই এসকিউএল যেমন আপনার কোনও এসকিউএল সম্পাদক যেমন পিএইচপিএমইএডমিন এসকিউএল সম্পাদক হিসাবে পছন্দ করেন তেমন পরীক্ষা করুন!

বিজ্ঞপ্তি:

সমাধানটি লারাভেল 5.4 দিয়ে পরীক্ষা করা হয়েছে ।


2
এটি এখন পর্যন্ত সেরা উত্তর! খুবই সোজা! :)
পিকার্ড

এটি বাইন্ডিং সহ কোয়েরিটি প্রদর্শন করবে না, অর্থাৎ বাঁধাইয়ের মতো দেখাবে:id
শান্ত কুমার

@ শান্থকুমারা আসলে আপনি জানেন না যে আপনি যে লারাভেল ব্যবহার করেছেন সেটির সংস্করণ বা কনফিগারেশন কী। তবে আমার উত্তরের প্রতিটি স্নিপেট বা কোড লারাভেল 5.4 প্রকল্পের রিয়েল কোড আউটপুট থেকে অনুলিপি করে আটকানো হয়েছিল।
সৈয়দবাকআর

6

লারাভেল এক্সিকিউটেড ক্যোয়ারী দেখতে লারাভেল ক্যোয়ারী লগ ব্যবহার করুন

DB::enableQueryLog();

$queries = DB::getQueryLog();

6

লারাভেল ৫.৮.১৫ অনুসারে ক্যোয়ারী নির্মাতার এখন রয়েছে dd এবং dumpপদ্ধতিগুলি যাতে আপনি করতে পারেন

DB::table('data')->where('a', 1)->dump();

ধন্যবাদ। ডিডি সত্যিই ভাল কাজ করে। ডিবি :: টেবিল ('ডেটা') -> যেখানে ('এ', 1) -> ডিডি ();
ওয়াকাস

তালিকাভুক্ত অন্যান্য উত্তরগুলির চেয়ে ভাল।
হামেস এ। খান

5

এই ফাংশনটি আমি আমার বেস মডেল ক্লাসে রেখেছি। এটিতে কেবল ক্যোয়ারির নির্মাতা বস্তুটি পাস করুন এবং এসকিউএল স্ট্রিংটি ফিরে আসবে।

function getSQL($builder) {
  $sql = $builder->toSql();
  foreach ( $builder->getBindings() as $binding ) {
    $value = is_numeric($binding) ? $binding : "'".$binding."'";
    $sql = preg_replace('/\?/', $value, $sql, 1);
  }
  return $sql;
}


4

লারাভেল 5.5.X এর জন্য

আপনি যদি নিজের অ্যাপ্লিকেশন দ্বারা চালিত প্রতিটি এসকিউএল কোয়েরি পেতে চান তবে আপনি শোনার পদ্ধতিটি ব্যবহার করতে পারেন। এই পদ্ধতিটি লগিং অনুসন্ধানগুলি বা ডিবাগিংয়ের জন্য দরকারী। আপনি আপনার জিজ্ঞাসা শ্রোতাদের একটি পরিষেবা সরবরাহকারীর নিবন্ধন করতে পারেন:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        DB::listen(function ($query) {
            // $query->sql
            // $query->bindings
            // $query->time
        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

সূত্র


4

আপনার আবেদনে এই ফাংশনটি যুক্ত করুন এবং কেবল কল করুন।

function getQuery($sql){
        $query = str_replace(array('?'), array('\'%s\''), $sql->toSql());
        $query = vsprintf($query, $sql->getBindings());     
        return $query;
}

আউটপুট : "থেকে নির্বাচন করুন * userযেখানে lang= 'স্বীকারোক্তি' এবং statusদ্বারা = '1' অর্ডার updated_atনিম্নক্রমে সীমা 25 অফসেট 0"


3

আপনি যখন আপনার পৃষ্ঠাটি লোড করবেন তখন কার্যকর হওয়া সমস্ত প্রশ্নের জন্য আপনি এই প্যাকেজটি ব্যবহার করতে পারেন

https://github.com/barryvdh/laravel-debugbar

আপনার কাছে ক্যোয়ারের ত্রুটি না থাকলে সেই প্যাকেজটি ভাল। আপনার যদি কোনও এসকিউএল ত্রুটি থাকে তবে এটি কিছু দেখায় না
lewis4u


2

আপনি যদি লারাভেল ব্যবহার না করে তবে স্বতন্ত্র প্যাকেজ ব্যবহার করছেন তবে:

use \Illuminate\Database\Capsule\Manager as Capsule;
use \Illuminate\Events\Dispatcher;
use \Illuminate\Container\Container;

$capsule = new Capsule;

$capsule->addConnection([
    // connection details
]);
// Set the event dispatcher used by Eloquent models... (optional)
$capsule->setEventDispatcher(new Dispatcher(new Container));

// Make this Capsule instance available globally via static methods... (optional)
$capsule->setAsGlobal();

// Setup the Eloquent ORM...(optional unless you've used setEventDispatcher())
$capsule->bootEloquent();

// Listen for Query Events for Debug
$events = new Dispatcher;
$events->listen('illuminate.query', function($query, $bindings, $time, $name)
{
    // Format binding data for sql insertion
    foreach ($bindings as $i => $binding) {
        if ($binding instanceof \DateTime) {
            $bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
        } else if (is_string($binding)) {
            $bindings[$i] = "'$binding'";`enter code here`
        }
    }

    // Insert bindings into query
    $query = str_replace(array('%', '?'), array('%%', '%s'), $query);
    $query = vsprintf($query, $bindings);

    // Debug SQL queries
    echo 'SQL: [' . $query . ']';
});

$capsule->setEventDispatcher($events);

2

তুমি ব্যবহার করতে পার ঘড়ির কাঁটা

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

তবে ফায়ারফক্সেও কাজ করে


2

এসকিউএল এবং কিছু কোয়েরি থেকে বাইন্ডিং পেতে আমি কিছু সাধারণ ফাংশন তৈরি করেছি।

/**
 * getSql
 *
 * Usage:
 * getSql( DB::table("users") )
 * 
 * Get the current SQL and bindings
 * 
 * @param  mixed  $query  Relation / Eloquent Builder / Query Builder
 * @return array          Array with sql and bindings or else false
 */
function getSql($query)
{
    if( $query instanceof Illuminate\Database\Eloquent\Relations\Relation )
    {
        $query = $query->getBaseQuery();
    }

    if( $query instanceof Illuminate\Database\Eloquent\Builder )
    {
        $query = $query->getQuery();
    }

    if( $query instanceof Illuminate\Database\Query\Builder )
    {
        return [ 'query' => $query->toSql(), 'bindings' => $query->getBindings() ];
    }

    return false;
}

/**
 * logQuery
 *
 * Get the SQL from a query in a closure
 *
 * Usage:
 * logQueries(function() {
 *     return User::first()->applications;
 * });
 * 
 * @param  closure $callback              function to call some queries in
 * @return Illuminate\Support\Collection  Collection of queries
 */
function logQueries(closure $callback) 
{
    // check if query logging is enabled
    $logging = DB::logging();

    // Get number of queries
    $numberOfQueries = count(DB::getQueryLog());

    // if logging not enabled, temporarily enable it
    if( !$logging ) DB::enableQueryLog();

    $query = $callback();

    $lastQuery = getSql($query);

    // Get querylog
    $queries = new Illuminate\Support\Collection( DB::getQueryLog() );

    // calculate the number of queries done in callback
    $queryCount = $queries->count() - $numberOfQueries;

    // Get last queries
    $lastQueries = $queries->take(-$queryCount);

    // disable query logging
    if( !$logging ) DB::disableQueryLog();

    // if callback returns a builder object, return the sql and bindings of it
    if( $lastQuery )
    {
        $lastQueries->push($lastQuery);
    }

    return $lastQueries;
}

ব্যবহার:

getSql( DB::table('users') );
// returns 
// [
//     "sql" => "select * from `users`",
//     "bindings" => [],
// ]

getSql( $project->rooms() );
// returns
// [
//     "sql" => "select * from `rooms` where `rooms`.`project_id` = ? and `rooms`.`project_id` is not null",
//     "bindings" => [ 7 ],
// ]

2

আমি এই কাঠামোটিকে যতটা ভালবাসি, ততই ঘৃণা করি যখন এটি বাচ্চাদের মতো কাজ করে।

DB::enableQueryLog()সম্পূর্ণ অকেজো। DB::listenসমান অকেজো। আমি যখন বললাম তখন এটি ক্যোয়ারির অংশটি দেখিয়েছিল $query->count(), তবে আমি যদি তা করি$query->get() এটি বলার কিছুই নেই।

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


ক্যোয়ারী লগটি আমার পক্ষে কমপক্ষে কাজ করে। আপনার অ্যাপ্লিকেশনটিতে আপনার কিছু অন্যান্য ত্রুটি থাকতে হবে
ব্যবহারকারীর 1415066

1

আপনি যদি টিঙ্কার ব্যবহার করে থাকেন এবং গঠিত এসকিউএল কোয়েরিটি লগ করতে চান তবে আপনি এটি করতে পারেন

$ php artisan tinker
Psy Shell v0.9.9 (PHP 7.3.5  cli) by Justin Hileman
>>> DB::listen(function ($query) { dump($query->sql); dump($query->bindings); dump($query->time); });
=> null
>>> App\User::find(1)
"select * from `users` where `users`.`id` = ? limit 1"
array:1 [
  0 => 1
]
6.99
=> App\User {#3131
     id: 1,
     name: "admin",
     email: "admin@example.com",
     created_at: "2019-01-11 19:06:23",
     updated_at: "2019-01-11 19:06:23",
   }
>>>

1

এটা চেষ্টা কর:

$results = DB::table('users')->toSql();
dd($results);

দ্রষ্টব্য: কাঁচা এসকিউএল কোয়েরি প্রদর্শন করতে get () toSQL () এর সাথে প্রতিস্থাপন করা হয়েছে।


1

লগ ভিউয়ের উপর ভিত্তি করে আমার এটি করার পদ্ধতিটি কেবলমাত্র ফাইলটি পরিবর্তন করতে হবে app/Providers/AppServiceProvider.php:

  1. এই কোডটি যুক্ত করুন app/Providers/AppServiceProvider.php
/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    //
    DB::listen(function ($query) {
        $querySql = str_replace(['?'], ['\'%s\''], $query->sql);
        $queryRawSql = vsprintf($querySql, $query->bindings);
        Log::debug('[SQL EXEC]', [
                "raw sql"  => $queryRawSql,
                "time" => $query->time,
            ]
        );
    });
}
  1. আমার স্কয়ার হ্যান্ডেল কোড:
$users = DB::table('users')
    ->select(DB::raw('count(*) as user_count, username '))
    ->where('uid', '>=', 10)
    ->limit(100)
    ->groupBy('username')
    ->get()
;
dd($users);
  1. লগ দেখুন storage/logs/laravel-2019-10-27.log:
[2019-10-27 17:39:17] local.DEBUG: [SQL EXEC] {"raw sql":"select count(*) as user_count, username  from `users` where `uid` >= '10' group by `username` limit 100","time":304.21} 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.