Skip to main content

Qué son los mensajes de orden superior

Los mensajes de orden superior (Higher-order Messages) son una sintaxis para invocar métodos de una colección accediendo a ellos como si fueran propiedades. Sin escribir una callback, puedes llamar a un método o acceder a una propiedad de cada elemento.
$users->map->name significa «extrae la propiedad name de cada usuario y aplica map».

Cómo funciona — HigherOrderCollectionProxy

Cuando accedes a algo como $collection->map como si fuera una propiedad, se invoca __get() del trait EnumeratesValues.
Si el nombre está en $proxies, se devuelve una instancia de HigherOrderCollectionProxy. Este proxy conserva la colección y el nombre del método.

Proxy de acceso a propiedad mediante __get

Si a continuación accedes a una propiedad (->name), se invoca el __get() del proxy.
Es decir, $users->map->name equivale a:

Proxy de llamada a método mediante __call

Si en su lugar llamas a un método (->activate()), se invoca el __call() del proxy.
$users->each->activate() equivale a:

Lista de métodos compatibles

Los métodos disponibles como mensajes de orden superior se declaran en el array $proxies.
Para añadir métodos personalizados, usa Collection::proxy().

Casos de uso prácticos

Colecciones de modelos Eloquent

Los mensajes de orden superior son especialmente útiles con colecciones de Eloquent.

Filtrado

Agregaciones

Agrupación y ordenación

Aplanar con flatMap

Comprobaciones condicionales

Colecciones de cadenas

También se pueden usar en colecciones de cadenas. El __call() del proxy trata las cadenas como si fueran una llamada estática.
Para usar mensajes de orden superior con una colección de cadenas, el método debe existir estáticamente en el tipo string. Normalmente, encajan mejor con colecciones de modelos Eloquent o clases propias.

Comparación con closures normales

Los mensajes de orden superior son concisos, pero no encajan en todos los casos.
Cuando quieres «obtener la misma propiedad de cada elemento» o «llamar al mismo método en cada elemento», los mensajes de orden superior son más legibles. Si la condición es compleja o los argumentos son dinámicos, usa una closure.

Usar mensajes de orden superior en clases propias

Para aprovechar el mecanismo de HigherOrderCollectionProxy a través del trait EnumeratesValues, llama a Collection::proxy() para añadir el método al conjunto de proxies.

Próximos pasos

Trait Conditionable

Aprende la implementación interna de when() / unless() y cómo aplicarla en QueryBuilder y clases propias.
Última modificación el 13 de julio de 2026