WhereHas en Laravel, para aplicar condiciones where sobre relaciones
Vamos a hablar aquí sobre la relación de la categoría. Recordemos que, para el libro, nosotros tenemos es el post, y con el post es que obtenemos la categoría, tal como tenemos acá:
class Book extends Model
{
***
public function post()
{
return $this->belongsTo(Post::class);
}
}
class Post extends TaggableModel
{
***
public function category()
{
return $this->belongsTo(Category::class);
//->select('id', 'title', 'slug');
}
}
Es decir, no la tenemos tan directa como la teníamos con el post, donde podíamos consultar la categoría de manera muy sencilla, porque ya la teníamos ahí. Tal vez no la relación directamente, pero al menos el category_id sí estaba presente.
Si revisamos por aquí, cuando hacemos la consulta, preguntamos directamente sobre la categoría, es decir, un campo que ya forma parte de la entidad post. Pero aquí la cosa cambia.
Relación a través del Post
Queremos acceder a la categoría no desde un campo directo, sino desde una relación, que en este caso es el post. Así de simple.
Por lo tanto, cambia la manera de consultar, y tenemos que emplear, para resumir, en vez del where, el whereHas.
¿Qué es whereHas?
En resumidas cuentas, el has (que creo que es la primera vez que lo empleo en un curso) es la forma de hacer consultas sobre relaciones. Así de simple.
En pocas palabras, mediante un where no podemos hacer consultas a relaciones. Aunque hay una pequeña consideración: si estuvieras empleando un join, perfectamente podrías usar where, que sería como quien dice, la manera tradicional de toda la vida.
Pero en este caso estamos trabajando con with, y por lo tanto, no podemos hacerlo de esa forma:
Book::with(['post', 'post.category'])
->when($this->category_id, function (Builder $query, $category_id) {
$query->whereHas('post', function ($q) use ($category_id) {
$q->where('category_id', $category_id);
});
})
Resumen: ¿Por qué usamos whereHas?
En resumidas cuentas, whereHas es el mecanismo que tenemos para hacer una condición where sobre una relación.
Quédate con eso: para eso usamos whereHas.
Para todo lo demás, existe Mastercard… perdón, existe Eloquent.
Acepto recibir anuncios de interes sobre este Blog.
Te muestro el funcionamiento del whereHas, en el cual, obtenemos la referencia de la categoría desde un libro: Book - Post - Category
- Andrés Cruz