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>