Qué son los casts
Los casts de Eloquent convierten los valores en bruto obtenidos de la base de datos a tipos de PHP y, al guardar, aplican la conversión inversa. Se declaran en el métodocasts.
Tipos de casts integrados
Lista de los casts que Laravel ofrece de forma predeterminada.AsArrayObject y AsCollection se implementan internamente en Laravel como casts personalizados para permitir modificar directamente offsets concretos del array.Crear una clase de cast personalizado
Cuando los casts integrados no cubren la conversión que necesitas, crea un cast personalizado implementando la interfazCastsAttributes.
Definición de la interfaz
El contrato del framework se define así:$attributes contiene todos los atributos del modelo, es posible hacer conversiones que abarquen varias columnas (ver el patrón Value Object más abajo).
Implementación básica de un cast personalizado
Genera el esqueleto con el comandomake:cast.
app/Casts/AsMoney.php. Como ejemplo, vamos a implementar un cast que convierte un importe (almacenado como entero) en un Value Object Money.
$order->price devuelve una instancia de Money.
Casts de Value Object
Patrón para tratar varias columnas de la BD como un único Value Object.Ejemplo: cast de dirección
Combina las dos columnasaddress_line_one y address_line_two en un Value Object Address.
Si
set devuelve un array, Eloquent interpreta las claves como nombres de columna y guarda cada valor en su columna correspondiente. En casts de una sola columna se devuelve una cadena o un entero.Caché del Value Object
Eloquent cachea los atributos convertidos en Value Objects. Si accedes dos veces al mismo atributo, se devuelve la misma instancia. Si quieres desactivar la caché, añade la propiedad$withoutObjectCaching a la clase del cast.
Casts entrantes (solo escritura)
Casts que solo aplican la conversión al escribir en la BD, sin transformar nada al leer. Se implementan mediante la interfazCastsInboundAttributes.
Un uso típico es el hashing. Solo se transforma al guardar contraseñas o valores secretos; al leer se devuelve el hash tal cual.
Parámetros de cast
Para pasar parámetros a un cast personalizado, especifícalos tras el nombre de la clase separados por dos puntos. Varios parámetros se separan por comas.Castables: colocar la lógica de cast en el propio Value Object
Un Value Object que implementa la interfazCastable proporciona un método castUsing que devuelve su clase de cast. Con esto, el modelo no necesita conocer la clase de cast y la lógica de dominio queda mejor organizada.
Interacción con $appends y $hidden
Los casts y $appends / $hidden son mecanismos independientes, pero al combinarlos hay que tener cuidado.
Añadir casts en tiempo de ejecución
Cuando quieras añadir un cast solo para una consulta o una petición concreta, usa el métodomergeCasts.
Próximos pasos
Observers de Eloquent y eventos del modelo
Aprende a engancharte a los eventos del ciclo de vida (guardar, borrar, etc.) del modelo para añadir procesamiento.