لاراول جابز (laraveljobs)
لاراول جابز (laraveljobs)
خواندن ۳ دقیقه·۶ ماه پیش

استفاده از Eager Loading در لاراول

برنامه نویسان دائما در حال جست و جو برای یافتن بهترین روش ها (best practices) در لاراول هستند. لاراول به ما اجازه میدهد تا با روش های متفاوب فیچر ها را پیاده سازی کنیم. بنابراین در لاراول تقریبا هیچ روش کاملا صحیح و بدون نقصی نداریم! اما اشتباهات آشکاری وجود دارند که باید از آنها جلوگیری کنیم. لاراول جابز، اولین پلتفرم تخصصی استخدام برنامه نویسان لاراول، در نظر دارد در این مقاله به یکی از آنها اشاره کند.

چه چیزی یک روش بد یا bad practice تلقی می شود؟

به طور کلی هر روشی که در آینده، تاثیر مخرب و منفی روی اپلیکیشن و کسب و کار بگذارد، روشی ست که باید از آن جلوگیری شود.

اگر بخواییم جزئی تر نگاه کنیم، به طور کلی هر کدی که به شکل و روش بَدی نوشته شود میتواند در آینده باعث :
1- مشکلات امنیتی
2- مشکلات پرفورمنسی
3- افزایش باگ
شود. از این رو لاراول جابز، اولین پلتفرم تخصصی استخدام برنامه نویسان لاراول، در این مقاله به یکی از bad practice ها در لاراول اشاره میکند.


استفاده نکردن از Eager Loading در لاراول

بگذارید با واضح ترین و پرتکرار ترین اشتباه برنامه نویسان لاراول شروع کنیم و آن هم، زدن کوئری N+1 است!
این قطعه کد برای همه ما آشناست، بله دقیقا همین، یک اشتباه بزرگ است!

use App\Models\Book; $books = Book::all(); foreach ($books as $book) { echo $book->author->name; }

متوجه اشتباه ش شدید؟!
اگه نه، بزارید برای درک بهتر موضوع، نگاهی ببیندازیم به کوئری های SQL که لاراول در پشت صحنه (under the hood) برای گرفتن نویسنده ی (author) هر کتاب، به دیتابیس میزنه.

در لاراول برای به دست آوردن کوئری هایی که زده میشه پکیج های متفاوتی وجود داره. میتونید لیست اون پکیج هارو در این مقاله که توسط لاراول جابز، اولین پلتفرم تخصصی استخدام برنامه نویسان لاراول نوشته شده، ببینید.

همون طور که در عکس میبینید ما با استفاده از پکیج لاراول دیباگبار (Laravel Debugbar)، متوجه شدیم که برای گرفتن نویسنده ی هر کتاب، یک دستور SQL به دیتابیس زده شده! (حالا متوجه شدید که چرا اسم اون N+1 هست؟ یکی برای گرفتن کل کتاب ها + بقیه هم برای گرفتن نویسنده ی هر کتاب)
این روش شاید در اپلیکیشن های کوچک تاثیر زیادی در لود صفحه یا ریسپانس تایم نزاره اما در اپلیکیشن های بزرگ که کاربران در هر ثانیه تعامل زیادی با دیتابیس دارند، قطعا یک مشکل جدی ست و باید از کوئری زدن های بیهوده به دیتابیس جلوگیری بشه.

و اما راه حل! تا الان در خصوص مشکل و از باب مشخص شدن اون جلو رفتیم. حالا میخواییم این اشتباه رو اصلاح کنیم و پرفورمنس کدمون رو افزایش بدیم.

$books = Book::with('author')->get(); foreach ($books as $book) { echo $book->author->name; }

شما با استفاده از متد with میتونید کوئری ها رو به 2 کوئری کاهش بدید! یکی برای گرفتن کل کتاب ها و دیگری برای گرفتن نویسندگان آنها.

select * from books select * from authors where id in (1, 2, 3, 4, 5, ...)

لاراول جابز، اولین پلتفرم تخصصی استخدام برنامه نویسان لاراول، امیدوار است از این مطلب استفاده کرده باشید و بتونید با استفاده از Eager Loading پرفورمنس اپلیکیشن تون رو بالاتر ببرید. خیلی خوشحال میشیم اگه نظرتون رو توی کامنت بهمون بگید.


لاراولeager loadingbest practice
شاید از این پست‌ها خوشتان بیاید