Nueva clase Where para reemplazar a DataBaseWhere. Esta clase iría directamente en la carpeta Core dado su uso extensivo. La clase original permanecerá en la carpeta Core/Base/DataBase para dar compatibilidad durante unos meses.
// WHERE sevende = true AND secompra = true
$where = [
Where::column('sevende', true),
Where::and('secompra', true)
];
// los métodos or() y and() son simplemente para dar más expresividad,
// igualmente se puede poner la operación como cuarto parámetro del column
$where2 = [
Where::column('sevende', true),
Where::or('secompra', true)
];
$where3 = [
Where::column('sevende', true),
Where::column('secompra', true, '=', 'OR')
];
// $where2 y $where3 son iguales
En caso de duda, debemos tener un método intuitivo para obtener el SQL resultante de un array where que estemos haciendo.
$where = [
Where::column('sevende', true),
Where::and('secompra', true)
];
echo Where::sql($where);
// WHERE sevende = true AND secompra = true
El siguiente where generaría este SQL: where sevende = true and ventasinstock = false or secompra = true and nostock = false
$where = [
Where::column('sevende', true),
Where::and('ventasinstock', false),
Where::or('secompra', true),
Where::and('nostock', false)
];
Pero quizás queríamos agrupar el segundo y tercer elemento o el tercero y el cuarto. Para evitar sorpresas necesitamos una forma intuitiva de indicar cuando agrupar y qué elementos agrupar. Vemos cada una de las posibles combinaciones:
$where = [
Where::group(),
Where::column('sevende', true),
Where::and('ventasinstock', false),
Where::groupEnd(),
Where::orGroup(),
Where::column('secompra', true),
Where::and('nostock', false),
Where::groupEnd(),
];
$where = [
Where::column('sevende', true),
Where::andGroup(),
Where::column('ventasinstock', false),
Where::or('secompra', true),
Where::groupEnd(),
Where::and('nostock', false)
];
Tenemos muchos casos donde nos interesa tratar una cadena como un entero o un entero como una cadena. Hasta ahora veníamos usando las funciones específicas de cast de mysql o postgresql, pero es más interesante tener los modificadores ::integer y ::string para que sea la base de datos la que se encargue de la conversión.
$asientoModel = new Asiento();
// numero es un string
$where = [Where::column('numero::integer', 100, '<=')];
$orderBy = ['numero::integer' => 'ASC'];
$primeros = $asientoModelo->all($where, $orderBy, 0, 0);
Podríamos implementar una función en el fsmaker para realizar este cambio de forma masiva en todos los archivos del plugin:
fsmaker migrate:where
El fsmaker recorrería todos los archivos php del directorio (y subdirectorios) reemplazando new DataBaseWhere
por Where::column
.
Esto es una sugerencia a debatir. Está abierta a comentarios, votación y debate en la reunión semanal. Si se aprueba pasará a estado pendiente.