| کانال توسعه‌دهندگان لاراول |
1.55K subscribers
58 photos
120 links
⭕️ کانال توسعه‌دهندگان لاراول دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
🚀 جلوگیری از مشکل N+1 در Eloquent با eager loading و withCount

خیلی از باگ‌ها و افت کارایی در اپ‌های لاراول از درخواست‌های اضافی دیتابیس (مشکل N+1) ناشی می‌شه. با استفاده از eager loading و withCount می‌تونید هم تعداد کوئری‌ها رو کم کنید و هم اطلاعاتی مثل تعداد ارتباط‌ها رو بدون کوئری‌های اضافی بگیرید. 💡

مثال عملی: فرض کنید مدل Post و رابطه comments دارید. اگر بدون eager loading لیست پست‌ها رو رندر کنید، هر بار که به comments دسترسی پیدا می‌کنید یک کوئری جدید اجرا می‌شه — N+1.

راه ساده و بهینه:

$posts = Post::with('comments')->get();
foreach ($posts as $post) {
// دسترسی به رابطه بدون کوئری اضافی
echo $post->comments->count();
}

// اگر فقط تعداد نیاز دارید، از withCount استفاده کنید:
$posts = Post::withCount('comments')->get();
foreach ($posts as $post) {
echo $post->comments_count; // مقدار از همان کوئری اصلی
}


نکات عملی و بهترین روش‌ها:
- وقتی فقط تعداد رابطه لازم دارید از withCount استفاده کنید تا داده‌های اضافی لود نشه. 🔍
- برای بارگذاری شرطی (مثلاً فقط کامنت‌های تاییدشده) از closure در with استفاده کنید: with(['comments' => fn($q) => $q->where('approved', 1)]).
- برای دیتاست‌های بزرگ از chunk یا cursor استفاده کنید تا حافظه پر نشه. ⚠️

اشتباه رایج: افزودن eager loading برای روابطی که هرگز استفاده نمی‌شن — فقط روابط لازم را بارگذاری کنید تا از overhead جلوگیری کنید.

با این روش ساده، کوئری‌ها به‌مراتب کم‌تر و صفحه‌ها سریع‌تر بارگذاری می‌شن. امتحان کنید و بازخورد یا تجربه‌تون رو به اشتراک بذارید. 🙌

Laravel Docs — Eloquent Relationships

🔖 #Laravel #PHP #لاراول #Laravel #Eloquent #Performance #EagerLoading

👤 Developix

💎 Channel: @DevelopixLaravel
9👍1