How to reduce code duplication with relationships in Laravel
Categorized as Laravel
Since Laravel 9.16 we can reduce the code a bit, using withWhereHas()
method. It’s time to do some code clean up! See the example below:
// Before
Store::whereHas('products', function ($query) {
$query->where('enabled', true)->where('sale', true);
})->with(['products' => function ($query) {
$query->where('enabled', true)->where('sale', true);
}]);
// After
Store::withWhereHas('products', fn ($query) => $query->where('enabled', true)->where('sale', true));
As Laravel contributor Eusonlito describes:
There are a lot of times that we need to load a relationship using with
with the same conditions that we use for whereHas
. This method simplifies this selection by avoiding repeating the code used both to filter with whereHas
and then to select that same record using with
. There is less code, it is more readable and easier to maintain