Eloquent::when(): برای کوئری های مشروط

برای مدت ها، اکثر ما برنامه نویس ها برای کوئری های مشروط از “if-else” استفاده می کردیم، مثل مثال زیر:

if (request('filter_by') == 'likes') {
    $query->where('likes', '>', request('likes_amount', 0));
}
if (request('filter_by') == 'date') {
    $query->orderBy('created_at', request('ordering_rule', 'desc'));
}

حالا من بهتون میگم که راه خیلی بهتری برای انجامش هست. یک راه ساده و لاراولی. متد when() را ببینید.


$query = Author::query();
 
$query->when(request('filter_by') == 'likes', function ($q) {
    return $q->where('likes', '>', request('likes_amount', 0));
});
$query->when(request('filter_by') == 'date', function ($q) {
    return $q->orderBy('created_at', request('ordering_rule', 'desc'));
});
 
$authors = $query->get();

خیلی بهتره، نه؟

صبر کنید که چیزهای بیشتری هم هست.

در مثال زیر، ما یوزرها رو فقط در هنگامی که یک مورد request ارسال شده باشد، فیلتر می کنیم.

یعنی، مادامی که هیچ پارامتری نباشد یا اینکه null/false باشد، شما همه یوزرها رو می‌بینید. اما اگر مقداری داشته باشد، مثلا بزارید برای ادمین عدد "1" در نظر بگیریم، اون وقت شما فقط یوزرهای ادمین را خواهید دید.


$query = User::query();
 
// From Laravel 5.4 you can pass the same condition value as a parameter
$query->when(request('role', false), function ($q, $role) { 
    return $q->where('role_id', $role);
});
 
$authors = $query->get();
 

این فقط یه راه تر و تمیز برای نوشتن if  هستش اما یه روش عالی برای سازماندهی کوئری های مشروط به حساب میاد.

اطلاعات بیشتر درباره کوئری های مشروط را اینجا بخوانید.

کامنت ها (2)

  • Samira گفته:

    07 آبان 1396 ساعت 11:43

    متن عالی بود ☺

  • محمد گفته:

    06 آبان 1396 ساعت 19:01

    متن جالبی بود،‌خیلی ساده و روون نوشته شده بود و مفهوم رو می رسوند. مرسی

ارسال نظر