دیباگ کردن Query ها در لاراول

1398/02/02
303
دیباگ کردن Query ها در لاراول

(ORM (Object-relational mapping لاراول کوئری های ما را بسیار ساده می کند و به ما اجازه می دهد که رکوردها را با کمترین زحمت از دیتابیس دریافت کنیم.

ممکن است بعضی اوقات ما یک تبادل پیشرفته با دیتابیس داشته باشیم که در این حالت باید یک sql واقعی تولید کنیم.

 

در این مقاله برخی از راه هایی را که می توانیم به صورت ساده کوئری های خود را بررسی کنیم، مورد ارزیابی قرار می دهیم.

ما یک کوئری ساده و در عین حال دارای مشکل را بررسی می کنیم.

$results = User::where(function($q) use ($request) {
    $q->orWhere('email', 'like', '%john@example.org%');
    $q->orWhere('first_name', 'like', '%John%');
    $q->orWhere('last_name', 'like', '%Doe%');
})->get();

آیا می توانید مشکل این کوئری را با بفهمید؟ اگر نفهمیدید اصلا نگران نباشید، ما دیباگ کردن را شروع می کنیم و ببینید که چه اتفاقی خواهد افتاد.

 

روش اول: دیباگ کردن به روش ساده

ساده ترین متد موجود برای فهم مشکل در کوئری هایمان، متد ()toSql<- است.

کاری که ما باید در این حالت انجام دهیم تغییر متد ()get به ()toSql است، که خروجی آن را می توانیم با ()dd که که به معنی
die and dump است ببینیم.

مانند زیر:

$results = User::where(function($q) use ($request) {
    $q->orWhere('email', 'like', '%john@example.org%');
    $q->orWhere('first_name', 'like', '%John%');
    $q->orWhere('last_name', 'like', '%Doe%');
})->toSql();
dd($results)

اکنون این کوئری را در مرورگر اجرا می کنیم و نتیجه را به صورت sql می بینیم.

select * from `users` where (`email` like ? or `first_name` like ? or `last_name` like ?)

این متد بسیار عالی است از این نظر که می توانیم خروجی کوئری های پیچیده را ببینیم و به راحتی آن را دیباگ کنیم.

 

روش دوم: گوش دادن به رویدادهای درخواستی (Listening For Query Events)

این روش به رویدادهای درخواستی ما با استفاده از شی DB گوش می دهد.

\DB::listen(function($sql) {
    var_dump($sql);
});

 

اکنون وقتی این صفحه را در مرورگر اجرا کنید،خروجی به شکل زیر است:

select * from `users` where (`email` like ? or `first_name` like ? or `last_name` like ?)

DB:listen کمی پیشرفته تر است که آن دو پارامتر اضافه می پذیرد که می توانیم برای پردازش اطلاعاتمان، پارامترهای مورد نظر خود را به آن ارسال کنیم.

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

مجددا صفحه را در مرورگر اجرا کنید و نتیجه ی آن به صورت زیر است.

string 'select * from `users` where (`email` like ? or `first_name` like ? or `last_name` like ?)' (length=89)
array (size=3)
  0 => string '%john@example.org%' (length=18)
  1 => string '%John%' (length=6)
  2 => string '%Doe%' (length=5)
float 35.63

همانطور که مشاهده می کنید به راحتی کوئری مورد نظر،نحوه ی bind کردن اطلاعات و زمان اجرا در خروجی قابل مشاهده است.

نتیجه گیری

آیا دیباگ کردن کوئری ها برای شما آشکار شده است؟

در کوئری هایمان به جای orWhere از where استفاده می کنیم.

حالا کد زیر را به راحتی دیباگ می کنیم:

$results = User::where(function($q) use ($request) {
    $q->where('email', 'like', '%john@example.org%');
    $q->where('first_name', 'like', '%John%');
    $q->where('last_name', 'like', '%Doe%');
})->get();

که در این حالت کوئری درست را به ما نشان می دهد.

select * from `users` where (`email` like '%john@example.org%' and `first_name` like '%John%' and `last_name` like '%Doe%')

 

اکنون شما می توانید با استفاده از روش های گفته شده به راحتی کوئری های خود را دیباگ کنید...

 

 

مقالات مرتبط
حمید تیموری 452 بازدید 1397/10/06
حمید تیموری 369 بازدید 1397/07/01
حمید تیموری 437 بازدید 1397/11/10
حمید تیموری 291 بازدید 1397/10/15
حمید تیموری 568 بازدید 1397/05/10
نظرات (0)
هنوز نظری ثبت نشده است
برای ثبت نظر ابتدا وارد سایت شوید