নিম্নলিখিত কোড দেওয়া:
DB::table('users')->get();
আমি কাঁচা এসকিউএল কোয়েরি স্ট্রিং পেতে চাই যা উপরের ডাটাবেস ক্যোয়ারী বিল্ডার উত্পন্ন করবে। এই উদাহরণে, এটি হবে SELECT * FROM users
।
আমি এটা কিভাবে করবো?
নিম্নলিখিত কোড দেওয়া:
DB::table('users')->get();
আমি কাঁচা এসকিউএল কোয়েরি স্ট্রিং পেতে চাই যা উপরের ডাটাবেস ক্যোয়ারী বিল্ডার উত্পন্ন করবে। এই উদাহরণে, এটি হবে SELECT * FROM users
।
আমি এটা কিভাবে করবো?
উত্তর:
স্ক্রিনে আউটপুট দেওয়ার জন্য শেষ ক্যোয়ারী ছুটে গেছে আপনি এটি ব্যবহার করতে পারেন:
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"
}
}
( নীচে জোশুয়ার মন্তব্যের জন্য ধন্যবাদ ।)
Log
ক্লাসটি ব্যবহার করে আপনার অ্যাপ্লিকেশনটির লগ এটিকে আউটপুট দেওয়া আরও ভাল হতে পারে : Log::debug(DB::getQueryLog())
DB::enableQueryLog();
DB::enableQueryLog(); dd(DB::getQueryLog());
কিন্তু তা ফিরে আসে []
....
DB::connection('database')->getQueryLog()
toSql()
একটি QueryBuilder
উদাহরণে পদ্ধতিটি ব্যবহার করুন ।
DB::table('users')->toSql()
ফিরে আসবে:
from ব্যবহারকারীগণ থেকে * নির্বাচন করুন `
ইভেন্ট শ্রোতাদের ওয়্যারিংয়ের চেয়ে এটি আরও সহজ এবং আপনার তৈরির সময় কোয়েরিটি যে কোনও মুহুর্তে আসলে কেমন হবে তা আপনাকে পরীক্ষা করতে দেয়।
getBindings
পদ্ধতিটি ব্যবহার করতে পারেন । এটি যাতে এসকিউএল স্টেটমেন্টের সাথে আবদ্ধ থাকবে সেগুলি যাতে এই বাইন্ডিংগুলি ফিরিয়ে দেয়।
$query = \DB::table('users')->where('id', 10); $sql = str_replace_array('?', $query->getBindings(), $query->toSql()); dd($sql);
DB::QueryLog()
আপনি কোয়েরি কার্যকর করার পরে কেবল কাজ করুন $builder->get()
। আপনি যদি ক্যোয়ারী চালানোর আগে ক্যোয়ারী পেতে চান তবে আপনি $builder->toSql()
পদ্ধতিটি ব্যবহার করতে পারেন । এটি এসকিএল পেতে এবং এটি আবদ্ধ করার উদাহরণ:
$query = str_replace(array('?'), array('\'%s\''), $builder->toSql());
$query = vsprintf($query, $builder->getBindings());
dump($query);
$result = $builder->get();
অথবা কেবল আপনার ক্যোয়ারী ত্রুটিযুক্ত করে নিন যেমন অ্যাসেক্সিস্ট টেবিল বা কলামটি কল করার জন্য, আপনি এক্সডি ব্যতীত উত্পন্ন উত্সটি দেখতে পাবেন
$query = vsprintf(str_replace(array('?'), array('\'%s\''), $builder->toSql()), $builder->getBindings());
LIKE
প্রশ্নের জন্য বা তারিখের ফর্ম্যাট করার সময় এটি কাজ করবে না Note দ্বিগুণ শতাংশের চিহ্ন সহ আপনাকে প্রথমে তাদের পালাতে হবে।
$builder->getBindings()
?
আপনি 'আলোকসজ্জা.কোয়ারি' ইভেন্টটি শুনতে পারেন। ক্যোয়ারির আগে নিম্নলিখিত ইভেন্ট শ্রোতাদের যুক্ত করুন:
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"
}
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Event;
আপনি কেবল কি করতে পারেন use Event;
যেহেতু এটি একটি এর ছদ্মরূপ ।
আপনি যদি লারাভেল ব্যবহার ছাড়াই আলোকিত করে লগটি পেতে চেষ্টা করছেন:
\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();
'US/Eastern'
।
quick function
। আমি বিশ্বাস করি যে অন্তর্নিহিত কোডটি প্রস্তুতি ( php.net/manual/en/mysqli.prepare.php ) পদ্ধতি ব্যবহার করবে , এজন্য কেবল ?
প্রয়োজন। আপনি একক উদ্ধৃতিতে ইনপুট সংযুক্ত করতে হবে কিনা তা নির্ধারণ করতে আপনি php.net/manual/en/function.is-numeric.php করতে পারেন।
is_numeric
ধারণাটি অন্তর্ভুক্ত করার জন্য উপরে সম্পাদনা করেছি ) এবং এটি কার্যকর! আমি এটা ভালোবাসি. ধন্যবাদ.
ক্যোয়ারী স্ট্রিং পাওয়ার জন্য স্পষ্টভাবে একটি পদ্ধতি রয়েছে is
toSql ()
আমাদের ক্ষেত্রে,
DB::table('users')->toSql();
প্রত্যাবর্তন
select * from users
এসকিউএল কোয়েরি স্ট্রিংটি ফেরত দেওয়ার সঠিক সমাধানটি..এই সহায়ক হ ...
->where('foo', '=', 'bar')
$data = User::toSql();
echo $data; //this will retrun select * from users. //here User is model
->toSql()
যদি মডেলের পরে আরও যুক্তি থাকে তবে আপনি যেমন করতে পারেন তেমন সংযোজন করতে পারেন। উদাহরণস্বরূপUser::where('id', 1)->toSql()
যদি আপনি লারাভেল 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
জ্বালান \ ডাটাবেস \ ক্যোয়ারী \ নির্মাতা
প্রথমে আপনাকে কল করে ক্যোয়ারী লগ সক্ষম করতে হবে:
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
]
]
এটি এখন পর্যন্ত সবচেয়ে ভাল সমাধান হ'ল আমি যে কোনও একটিকে ডিবাগ-ইন-ইলরোয়েন্ট শেষ কোয়েরি বা চূড়ান্ত ক্যোয়ারীর জন্য পরামর্শ দিতে পারি যদিও এটির পাশাপাশি আলোচনা করা হয়েছে:
// 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);
সহজভাবে আপনি toSql()
পদ্ধতি ব্যবহার করে নিম্নলিখিত জিনিসগুলি করতে পারেন ,
$query = DB::table('users')->get();
echo $query->toSql();
এটা কাজ করছে না করে তাহলে আপনি এটি সেট আপ করতে পারেন থেকে জিনিস Laravel ডকুমেন্টেশন ।
এটি করার আরেকটি উপায়
DB::getQueryLog()
কিন্তু এটি অক্ষম যদি এটা রিটার্ন একটি খালি অ্যারে ডিফল্টরূপে তারপর এর এই সফরের ,
শুধু সাথে সক্ষম করুন DB::enableQueryLog()
এবং এটি কাজ করবে :)
আরও তথ্যের জন্য গিথুব ইস্যু সম্পর্কে আরও জানতে ভিজিট করুন ।
আশা করি এটা সাহায্য করবে :)
বাইন্ডিংগুলির সাথে এসকিউএল কোয়েরি পেতে একটি 'ম্যাক্রোয়েবল' প্রতিস্থাপন।
পদ্ধতিতে ম্যাক্রো ফাংশন নীচে যুক্ত করুন ।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());
});
সুস্পষ্ট বিল্ডারের জন্য একটি উপকরণ যুক্ত করুন। ( লারাভেল 5.4+ )
\Illuminate\Database\Eloquent\Builder::macro('toRawSql', function(){
return ($this->getQuery()->toRawSql());
});
তারপরে যথারীতি ডিবাগ করুন। ( লারাভেল 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());
ল্যারাভেল 5.2
এবং পরবর্তী থেকে। আপনি DB::listen
এক্সিকিউটড ক্যোয়ারী পেতে ব্যবহার করতে পারেন ।
DB::listen(function ($query) {
// $query->sql
// $query->bindings
// $query->time
});
অথবা আপনি যদি কোনও একক Builder
উদাহরণটি ডিবাগ করতে চান তবে আপনি toSql
পদ্ধতিটি ব্যবহার করতে পারেন ।
DB::table('posts')->toSql();
সর্বাধিক সহজ উপায় হ'ল ইচ্ছাকৃত ভুল করা । উদাহরণস্বরূপ, আমি নিম্নলিখিত সম্পর্কের সম্পূর্ণ এসকিউএল কোয়েরি দেখতে চাই:
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_jobs
।job_id
যেমনpivot_job_id
,eqtype_jobs
।created_ats
যেমনpivot_created_ats
,eqtype_jobs
।updated_at
যেমনpivot_updated_at
,eqtype_jobs
।id
যেমনpivot_id
থেকেjobs
অভ্যন্তরীণ যোগদানeqtype_jobs
করুনjobs
।id
=eqtype_jobs
।job_id
যেখানেeqtype_jobs
।set_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 দিয়ে পরীক্ষা করা হয়েছে ।
:id
DB::enableQueryLog();
$queries = DB::getQueryLog();
লারাভেল ৫.৮.১৫ অনুসারে ক্যোয়ারী নির্মাতার এখন রয়েছে dd
এবং dump
পদ্ধতিগুলি যাতে আপনি করতে পারেন
DB::table('data')->where('a', 1)->dump();
এই ফাংশনটি আমি আমার বেস মডেল ক্লাসে রেখেছি। এটিতে কেবল ক্যোয়ারির নির্মাতা বস্তুটি পাস করুন এবং এসকিউএল স্ট্রিংটি ফিরে আসবে।
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;
}
আমার মতে, এটি একটি শিক্ষানবিশ হিসাবে সেরা পন্থা হবে:
echo "<pre>";
print_r($query->toSql());
print_r($query->getBindings());
এটি এখানে চিত্রিতও হয়। https://stackoverflow.com/a/59207557/9573341
লারাভেল 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()
{
//
}
}
আপনার আবেদনে এই ফাংশনটি যুক্ত করুন এবং কেবল কল করুন।
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"
আপনি যখন আপনার পৃষ্ঠাটি লোড করবেন তখন কার্যকর হওয়া সমস্ত প্রশ্নের জন্য আপনি এই প্যাকেজটি ব্যবহার করতে পারেন
https://github.com/barryvdh/laravel-debugbar
শেষ ক্যোয়ারী মুদ্রণ করুন
DB::enableQueryLog();
$query = DB::getQueryLog();
$lastQuery = end($query);
print_r($lastQuery);
আপনি যদি লারাভেল ব্যবহার না করে তবে স্বতন্ত্র প্যাকেজ ব্যবহার করছেন তবে:
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);
তুমি ব্যবহার করতে পার ঘড়ির কাঁটা
ক্লকওয়ার্ক হ'ল পিএইচপি বিকাশের জন্য ক্রোম এক্সটেনশান, বিকাশকারী সরঞ্জামগুলিকে একটি নতুন প্যানেল দিয়ে প্রসারিত করে যা আপনার পিএইচপি অ্যাপ্লিকেশনগুলিকে ডিবাগিং এবং প্রোফাইল করার জন্য দরকারী সমস্ত ধরণের তথ্য সরবরাহ করে, অনুরোধ, শিরোনাম, প্রাপ্ত এবং পোস্ট সম্পর্কিত তথ্য, কুকিজ, সেশন ডেটা, ডাটাবেস প্রশ্নগুলি, রুট, অ্যাপ্লিকেশন রানটাইমের দৃশ্যায়ন এবং আরও অনেক কিছু।
তবে ফায়ারফক্সেও কাজ করে
এসকিউএল এবং কিছু কোয়েরি থেকে বাইন্ডিং পেতে আমি কিছু সাধারণ ফাংশন তৈরি করেছি।
/**
* 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 ],
// ]
আমি এই কাঠামোটিকে যতটা ভালবাসি, ততই ঘৃণা করি যখন এটি বাচ্চাদের মতো কাজ করে।
DB::enableQueryLog()
সম্পূর্ণ অকেজো। DB::listen
সমান অকেজো। আমি যখন বললাম তখন এটি ক্যোয়ারির অংশটি দেখিয়েছিল $query->count()
, তবে আমি যদি তা করি$query->get()
এটি বলার কিছুই নেই।
ধারাবাহিকভাবে কাজ করার একমাত্র সমাধানটি হ'ল ডিআবাগ মোডে থাকার সময় কমান্ড লাইনে আপনার কোডটি ডিবাগ মোডে চালিয়ে ওআরএম প্যারামিটারগুলিতে ইচ্ছাকৃতভাবে কিছু বাক্য গঠন বা অন্য ত্রুটি স্থাপন করা হয়, এবং এটি এসকিউএল ত্রুটিটি থুতু ফেলবে will পরিশেষে সম্পূর্ণ ফ্রিকিন জিজ্ঞাসা সহ। অন্যথায়, আশা করি ওয়েব সার্ভার থেকে চালিত হলে লগ ফাইলে ত্রুটিটি উপস্থিত হয়।
আপনি যদি টিঙ্কার ব্যবহার করে থাকেন এবং গঠিত এসকিউএল কোয়েরিটি লগ করতে চান তবে আপনি এটি করতে পারেন
$ 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",
}
>>>
এটা চেষ্টা কর:
$results = DB::table('users')->toSql();
dd($results);
দ্রষ্টব্য: কাঁচা এসকিউএল কোয়েরি প্রদর্শন করতে get () toSQL () এর সাথে প্রতিস্থাপন করা হয়েছে।
লগ ভিউয়ের উপর ভিত্তি করে আমার এটি করার পদ্ধতিটি কেবলমাত্র ফাইলটি পরিবর্তন করতে হবে app/Providers/AppServiceProvider.php
:
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,
]
);
});
}
$users = DB::table('users')
->select(DB::raw('count(*) as user_count, username '))
->where('uid', '>=', 10)
->limit(100)
->groupBy('username')
->get()
;
dd($users);
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}
echo User::where('status', 1)->toSql();