Hacer una búsqueda por relación en Eloquent
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.