Skip to main content

Qué es el trait Conditionable

El trait Illuminate\Support\Traits\Conditionable añade a un objeto los métodos when() y unless(). Su característica principal es que permite bifurcar el comportamiento en función de una condición sin romper el encadenamiento de métodos.
El código fuente real se encuentra en src/Illuminate/Conditionable/Traits/Conditionable.php. Se referencia mediante el alias Illuminate\Support\Traits\Conditionable.
Muchas clases de Laravel, como QueryBuilder, EloquentBuilder, Mail o Notification, utilizan este trait.

Uso básico

when() — se ejecuta cuando la condición es verdadera

Cuando el valor del primer argumento es verdadero, se ejecuta la callback del segundo argumento. Cuando es falso, se ejecuta la callback (por defecto) del tercer argumento.

unless() — se ejecuta cuando la condición es falsa

unless() es el opuesto de when(): la callback se ejecuta cuando la condición es falsa.

Por qué la cadena de métodos continúa

Si la callback devuelve null, se devuelve $this (el objeto que utiliza el trait). Si la callback devuelve algo distinto de null, se devuelve ese valor.
Así se implementa en el código fuente:
Si la callback devuelve un valor explícito, ese valor se propaga al siguiente eslabón de la cadena. Si no devuelve nada (null), se devuelve $this.

Llamada sin argumentos — HigherOrderWhenProxy

Si llamas a when() sin argumentos, se devuelve un HigherOrderWhenProxy. Con él puedes definir la condición a posteriori.
Si lo llamas con un solo argumento, obtienes un proxy que conserva ese valor como condición.

Pasar un closure como valor

Si pasas un closure como primer argumento, el resultado de ejecutarlo se utiliza como condición.
De esta forma puedes extraer la lógica de evaluación de la condición a una callback.

Patrón típico en QueryBuilder

La construcción de consultas dinámicas con when() es el caso de uso más habitual.

Aplicar Conditionable a tus propias clases

Basta con hacer use del trait para que when() y unless() estén disponibles.

Uso con Mail, Notification y Response

when() también resulta útil para construir correos, notificaciones y respuestas.

Cuándo usar tap() y cuándo when()

tap() y when() se parecen, pero tienen propósitos distintos.
Si solo quieres hacer algo en medio de la cadena por efecto colateral (debug, logging), usa tap(). Si quieres cambiar el comportamiento según una condición, usa when() / unless().

Próximos pasos

Mensajes de orden superior en colecciones

Aprende cómo funciona una sintaxis como $collection->map->method() y cómo usarla en la práctica.
Última modificación el 13 de julio de 2026