Eloquent::when() - už nikdy více if-else v podmínkách dotazu
Většina z nás je již zvyklá psát podmínky dotazu s "if-else", například:
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'));
}
Co kdybych vám ale řekl, že existuje (mnohem) lepší způsob? Lépe čitelný a více "laravelácký". Seznamte se s metodou 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();
Vypadá lépe, nemyslíte?
// Od verze Laravel 5.4 můžete vložit podmínku jako parametr $query->when(request('role', false), function ($q, $role) { return $q->where('role_id', $role); });
$authors = $query->get();
Tento kód už není tolik hezký jako s použitím "if" ale je to dobrý způsob jak si zorganizovat podmínky v dotazu.
Více informací o podmínkách v dotazech najdete zde: <a href="https://laravel.com/docs/5.5/queries#conditional-clauses">https://laravel.com/docs/5.5/queries#conditional-clauses</a>
Zde najdete pull request ohledně použití podmínky v parametru (není zmíněno v oficiální dokumentaci): <a href="https://github.com/laravel/framework/pull/18419">https://github.com/laravel/framework/pull/18419</a>
<em>Zdroj: laraveldaily.com</em>