بخش دوم - مدل ها - قسمت نهم (متدهای گروهبندی و بارگذاری)
1- متد groupBy
برای گروهبندی نتایج بر اساس یک یا چند ستون استفاده میشود. این متد میتواند دادهها را بر اساس مقادیر مشابه در ستونهای مشخص گروهبندی کند.
$users = User::select('status')
->groupBy('status')
->get();این کوئری کاربران را بر اساس ستون status گروهبندی میکند.
2- متد havingRaw
برای اعمال شرطها بر روی نتایج گروهبندیشده استفاده میشود. این متد به شما اجازه میدهد که بر روی دادههای گروهبندیشده شرط خاصی اعمال کنید.
$users = User::select('status', \DB::raw('COUNT(*) as user_count'))
->groupBy('status')
->havingRaw('COUNT(*) > 5')
->get();این کوئری کاربران را بر اساس status گروهبندی میکند و فقط گروههایی را نمایش میدهد که تعداد کاربرانشان بیشتر از ۵ نفر باشد.
3- متد orHavingRaw
مشابه havingRaw است، اما به شما اجازه میدهد که از شرطهای OR استفاده کنید.
$users = User::select('status', \DB::raw('COUNT(*) as user_count'))
->groupBy('status')
->havingRaw('COUNT(*) > 5')
->orHavingRaw('COUNT(*) = 2')
->get();این کوئری کاربران را بر اساس status گروهبندی میکند و وضعیتهایی را نمایش میدهد که یا تعداد کاربران بیشتر از ۵ باشد یا دقیقا ۳ کاربر داشته باشند.
4- متد groupByRaw
برای گروهبندی نتایج با استفاده از عبارات خام SQL استفاده میشود.
$users = User::selectRaw('YEAR(created_at) as year, COUNT(*) as total')
->groupByRaw('YEAR(created_at)')
->get();این کوئری کاربران را بر اساس سال ثبتنام (created_at) گروهبندی میکند و تعداد کاربران ثبتشده در هر سال را برمیگرداند.
5- متد union
برای ترکیب دو کوئری مختلف استفاده میشود. این متد نتایج دو کوئری را در یک مجموعه واحد ترکیب میکند و مقادیر تکراری را حذف میکند.
$firstQuery = User::select('name')->where('status', 'active');
$secondQuery = User::select('name')->where('status', 'inactive');
$users = $firstQuery->union($secondQuery)->get();این کوئری نامهای کاربران با وضعیت active و inactive را ترکیب میکند و نتیجه را بدون مقادیر تکراری برمیگرداند.
6- متد unionAll
مشابه union است، اما برخلاف union، تمام نتایج دو کوئری را (حتی مقادیر تکراری) برمیگرداند.
$firstQuery = User::select('name')->where('status', 'active');
$secondQuery = User::select('name')->where('status', 'inactive');
$users = $firstQuery->unionAll($secondQuery)->get();این کوئری نامهای کاربران با وضعیت active و inactive را ترکیب میکند، اما برخلاف union، تمام نتایج (حتی مقادیر تکراری) را برمیگرداند.
7- متد chunk
مجموعهای از رکوردها را به بخشهای کوچکتر تقسیم میکند و برای هر بخش یک تابع فراخوانی میکند.
User::chunk(100, function ($users) {
foreach ($users as $user) {
//
}
});این کد کاربران را به دستههای ۱۰۰ تایی تقسیم میکند و به صورت جداگانه برای هر دسته تابعی را اجرا میکند. برای هر دسته ۱۰۰ کاربر، تابع تعریفشده فراخوانی میشود.
8- متد chunkById
این متد به صورت ویژه بر اساس id رکوردها بخشبندی میکند. این متد برای پردازش حجم زیادی از دادهها بدون نگرانی از تغییر یا حذف رکوردهای قبل از پردازش مفید است.
9- متد each
برای اجرای یک تابع روی هر رکورد به صورت جداگانه استفاده میشود. این متد اغلب به همراه متدهایی مانند lazy استفاده میشود.
User::chunk(100, function ($users) {
$users->each(function ($user) {
//
});
});این کد ابتدا کاربران را به دستههای ۱۰۰ تایی تقسیم میکند و سپس هر کاربر را جداگانه پردازش میکند.
10- متد lazy
دادهها را به صورت تدریجی و در لحظه (به جای لود کامل) بازیابی میکند. این متد کارآمدتر از get() برای مجموعه دادههای بزرگ است، چرا که همه رکوردها را همزمان در حافظه بارگذاری نمیکند.
User::lazy()->each(function ($user) {
//
});این کد به تدریج کاربران را یک به یک بازیابی و پردازش میکند، به جای اینکه همه کاربران را همزمان لود کند.
11- متد lazyById
مشابه lazy است، اما دادهها را بر اساس ستون id به صورت تدریجی بارگذاری میکند. این متد تضمین میکند که دادهها به صورت امن بر اساس id مرتب شده و بارگذاری میشوند.
12- متد lazyByIdDesc
مانند lazyById است، اما رکوردها را به صورت نزولی بر اساس id بارگذاری میکند.
▫️ 🟠
🔎 #laravel #لاراول #فصل_۴
💠 @AmirhDeveloper
.