Múltiples WHERE en Laravel Eloquent: de principiante a profesional

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Cómo crear consultas con múltiples condiciones WHERE en Laravel Eloquent



¿Alguna vez se ha sorprendido pensando: «Necesito filtrar registros por tres condiciones diferentes, pero la sintaxis de Eloquent es un poco confusa»? Si es así, no está solo. La pregunta "How to Create Multiple Where Clause Query Using Laravel Eloquent?" en Stack Overflow ha acumulado miles de visitas, y no es de extrañar. Trabajar con la base de datos es el corazón de cualquier aplicación PHP, y saber construir consultas complejas diferencia a un principiante de un profesional.



En este artículo, analizaremos todas las formas de crear múltiples condiciones WHERE en Laravel Eloquent: desde las cadenas más simples hasta las construcciones lógicas anidadas. Aprenderá a combinar AND y OR, usar whereHas para modelos relacionados y evitar errores típicos. ¡Allá vamos!



Sintaxis básica: cadena WHERE



La forma más obvia de agregar múltiples condiciones es simplemente llamar a where() varias veces seguidas. Por defecto, todas las condiciones se unen mediante AND.



// Obtener todos los usuarios donde status = 'active' Y role = 'admin'$users = User::where('status', 'active')             ->where('role', 'admin')             ->get();

// SQL equivalente:// SELECT * FROM users WHERE status = 'active' AND role = 'admin'


Se puede pasar un array de condiciones:



$users = User::where([    ['status', '=', 'active'],    ['role', '=', 'admin'],])->get();


Ambas opciones funcionan, pero la primera es más fácil de leer, especialmente cuando hay muchas condiciones.



Condición OR: cuando se necesita «o»



¿Y si necesitamos encontrar usuarios que sean O activos O administradores? Aquí entra en juego orWhere().



// Usuarios donde status = 'active' O role = 'admin'$users = User::where('status', 'active')             ->orWhere('role', 'admin')             ->get();

// SQL: SELECT * FROM users WHERE status = 'active' OR role = 'admin'


⚠️ Advertencia importante: Si mezcla where y orWhere, recuerde la prioridad de los operadores. Laravel los procesa secuencialmente, por lo que el resultado puede diferir de lo esperado.



Ejemplo con una trampa



// Queremos: (status = 'active' AND role = 'admin') OR (plan = 'premium')$users = User::where('status', 'active')             ->where('role', 'admin')             ->orWhere('plan', 'premium')             ->get();

// SQL: WHERE status = 'active' AND role = 'admin' OR plan = 'premium'// ¡Esto NO es lo mismo!


Para obtener el resultado correcto, use agrupación con una clausura:



$users = User::where(function ($query) {    $query->where('status', 'active')          ->where('role', 'admin');})->orWhere('plan', 'premium')  ->get();

// SQL: WHERE (status = 'active' AND role = 'admin') OR plan = 'premium'


WHERE anidados: agrupación de condiciones



Cuando la lógica se vuelve más compleja, las clausuras anidadas vienen al rescate. Esta es la herramienta más potente para crear condiciones complejas.



// (age > 18 AND status = 'active') OR (age <= 18 AND parent_approved = 1)$users = User::where(function ($query) {    $query->where('age', '>', 18)          ->where('status', 'active');})->orWhere(function ($query) {    $query->where('age', '<=', 18)          ->where('parent_approved', 1);})->get();


El código se lee como un libro: «encuentra usuarios que sean mayores de edad y activos, O menores de edad con aprobación de los padres».



Condiciones con operadores: WHERE IN, BETWEEN, NULL



Eloquent admite todos los operadores SQL estándar. Aquí hay algunos útiles:



whereIn — verificar pertenencia a una lista



<

Blogs

Book Recommendations