Skip to content

9.11.0 - Soporte nativo de campos DECIMAL exactos en el ORM

Choose a tag to compare

@osumionline osumionline released this 14 Oct 09:11
· 8 commits to main since this release
Immutable release. Only release title and notes can be modified.

Osumi Framework 9.11.0

Osumi Framework 9.11.0 incorpora soporte nativo para campos SQL DECIMAL(p,s) en el ORM, manteniendo los valores decimales exactos durante todo su ciclo de vida y evitando conversiones intermedias a punto flotante.

Novedades

Soporte nativo para DECIMAL

Se añade el nuevo tipo:

OField::DECIMAL

Los campos DECIMAL deben representarse siempre mediante propiedades PHP ?string:

#[OField(
	type: OField::DECIMAL,
	precision: 12,
	scale: 2,
	nullable: false
)]
public ?string $amount = null;

Los valores se mantienen como cadenas exactas y nunca se convierten a float.

La configuración predeterminada es:

  • precision: 10
  • scale: 2

Los límites soportados son:

  • precisión: 1 a 65
  • escala: 0 a 30
  • scale nunca puede ser mayor que precision

Normalización decimal

El ORM acepta tanto . como , como separador decimal de entrada:

"12"    → "12.00"
"12.5"  → "12.50"
"12,5"  → "12.50"
"-0,50" → "-0.50"

La representación interna utiliza siempre . y conserva una escala fija.

No se admiten:

  • valores float o int;
  • notación exponencial;
  • separadores de miles;
  • valores que requieran redondeo automático.

Los valores que superen la precisión o escala configuradas producen un error.

Consultas tipadas según el esquema

Las condiciones utilizadas por where() y count() se validan y normalizan ahora utilizando la definición del campo en el modelo.

Por ejemplo:

Payment::where([
	'amount' => '12,5'
]);

utiliza internamente:

12.50

mientras que utilizar un float para un campo DECIMAL es rechazado:

Payment::where([
	'amount' => 12.5
]);

También se rechazan condiciones que hagan referencia a campos inexistentes en el modelo.

Soporte en los generadores

Los comandos de generación del framework soportan ahora campos DECIMAL:

  • generateModel
  • generateModelFrom
  • generateModelFromDB

generateModelFromDB conserva la precisión, la escala y los valores predeterminados de columnas DECIMAL como cadenas exactas.

Esto permite realizar correctamente el recorrido:

MariaDB / MySQL
→ modelo Osumi Framework
→ SQL generado

sin convertir los valores decimales a punto flotante.

Restricciones

OField::DECIMAL está disponible exclusivamente para #[OField].

No puede utilizarse en campos #[OPK].

Los parámetros precision y scale tampoco pueden utilizarse con otros tipos de OField.

Compatibilidad con PHP 8.5

Se corrige además la inicialización del esquema ORM para comprobar ReflectionProperty::hasDefaultValue() antes de llamar a ReflectionProperty::getDefaultValue().

Esto evita el aviso deprecado de PHP 8.5 al procesar propiedades que no tienen un valor predeterminado explícito.

Compatibilidad

La actualización desde Osumi Framework 9.10.2 es compatible hacia atrás.

Los proyectos existentes que no utilicen OField::DECIMAL no necesitan modificar sus modelos.

No existe ningún paso automático de migración para esta versión.