Nueva clase Where para reemplazar a DataBaseWhere. Esta clase iría directamente en la carpeta Core dado su uso intensivo. La clase original permanecerá en la carpeta Core/Base/DataBase para dar compatibilidad durante unos meses.
// WHERE sevende = true AND secompra = true
$where = [
Where::eq('sevende', true),
Where::eq('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::eq('sevende', true),
Where::orEq('secompra', true)
];
$where3 = [
Where::column('sevende', true),
Where::column('secompra', true, '=', 'OR')
];
// $where2 y $where3 son iguales
Aprovechando el rediseño, hay que añadir el operador NOT LIKE
, que se usa para mostrar los registros que no contienen una cadena dada.
En caso de duda, debemos tener un método intuitivo para obtener el SQL resultante de un array where que estemos haciendo.
$where = [
Where::eq('sevende', true),
Where::eq('secompra', true)
];
echo Where::multiSql($where);
// sevende = true AND secompra = true
El siguiente where generaría este SQL: sevende = true AND ventasinstock = false OR secompra = true AND nostock = false
$where = [
Where::eq('sevende', true),
Where::eq('ventasinstock', false),
Where::orEq('secompra', true),
Where::eq('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::sub([
Where::eq('sevende', true),
Where::eq('ventasinstock', false)
]),
Where::orSub([
Where::eq('secompra', true),
Where::eq('nostock', false),
]),
];
$where = [
Where::eq('sevende', true),
Where::andSub([
Where::eq('ventasinstock', false),
Where::orEq('secompra', true),
]),
Where::eq('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::lte('integer:numero', 100)];
$orderBy = ['integer:numero' => '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
.
España, 11 años, nivel 100