Hacer una búsqueda por relación en Eloquent

Uso del método whereRelation para hacer búsquedas en relaciones en Eloquent

Hacer una búsqueda por relación en Eloquent
Photo by Jandira Sonnendeck / Unsplash

Muchas veces tenemos que hacer queries a la base de datos más complejas, teniendo que hacer una búsqueda dentro de una relación. Por ejemplo, para devolver los productos con más de 3 estrellas de valoración, o los usuarios que tengan rellenos ciertos datos.

Eloquent siempre ha sido bastante flexible en este sentido con el método whereHas, con el que podemos hacer cualquier búsqueda de forma manual a través del Query Builder:

use App\Models\Product;
use Illuminate\Database\Eloquent\Builder;

$products = Product::whereHas('reviews', function (Builder $query) {
    $query->where('stars', '>', 3);
})->get();

Sin embargo, desde Laravel 8 es posible usar una nueva función whereRelation, que lo pone aún más fácil:

use App\Models\Product;
use Illuminate\Database\Eloquent\Builder;

$products = Product::whereRelation('reviews', 'stars', '>', 3)->get();

El primer parámetro sería el nombre de la relación dentro de productos, el segundo el nombre del campo de la tabla relacionada, y luego el operador y el valor a comparar.