En Laravel, la capa del modelo con Eloquent es una de las capas del MVC que incluye Laravel más ricas y con más opciones, y que no está demás, ya que se trata de la capa de datos, la cual se conecta a la base de datos para gestionar la misma; hay muchos métodos disponibles en Eloquent, pero, vamos a conocer 3 que pueden confundirse que con los “Has”, “With” y “WhereHas”.
1. "Has": Filtrando modelos basados en relaciones
El método has()
se utiliza para filtrar los modelos seleccionados basándose en una relación. Funciona de manera similar a una condición normal WHERE
pero con una relación.
Si usas
has('relation')
, significa que solo deseas obtener los modelos que tienen al menos un modelo relacionado en esta relación.
Por ejemplo, consideremos un sistema de blog con dos tablas: “posts” y “comments”. Si queremos obtener todos los usuarios que tienen al menos un comentario, podemos hacerlo de la siguiente manera:
$users = User::has('comments')->get();
// Solo se incluirán los usuarios que tienen al menos un comentario en la colección
En pocas palabras, viene siendo una especie de condicional en la cual, se obtienen los usuarios que tengan al menos un comentario; en este ejemplo, comments viene siendo una relación de los usuarios.
2. "With": Cargando relaciones de manera eficiente (eager loading)
El método with()
se utiliza para cargar relaciones junto con la relación principal, anteriormente vimos el problema de N+1 en Laravel que se solventa mediante el método with.
Básicamente, junto con el modelo principal, Laravel cargará las relaciones que especifiques. Esto es especialmente útil cuando tienes una colección de modelos y deseas cargar una relación para todos ellos.
$users = User::with('posts')->get();
foreach ($users as $user) {
// Las publicaciones ya están cargadas y no se ejecuta una consulta adicional
$user->posts;
}
3. "WhereHas": Filtrando basado en relaciones con condiciones adicionales
El método whereHas()
funciona de manera similar a has()
, pero te permite especificar filtros adicionales para el modelo relacionado. Puedes agregar condiciones personalizadas para verificar en el modelo relacionado.
Por ejemplo, si queremos obtener todos los usuarios que tienen publicaciones creadas después de una fecha específica, podemos hacerlo así:
$users = User::whereHas('posts', function ($query) {
$query->where('created_at', '>=', '2021-01-01 00:00:00');
})->get();
// Solo se incluirán los usuarios que tienen publicaciones desde 2021 en adelante
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter