Where
La clase Where se usa en FacturaScripts para definir filtros para consultar a la base de datos. En lugar de escribir el SQL directamente, podemos usar esta clase:
use FacturaScripts\Core\Where;
$where = [
Where::gt('precio', 0),
Where::isNull('codfamilia')
];
$sql = 'SELECT * FROM productos WHERE ' . Where::multiSql($where);
// SELECT * FROM productos WHERE precio > 0 AND codfamilia IS NULL
Esta clase se usa activamente con la clase DbQuery y pronto con los nuevos modelos:
use FacturaScripts\Core\DbQuery;
use FacturaScripts\Core\Where;
$data = DbQuery::table('productos')
->whereMulti([
Where::gt('precio', 0),
Where::isNull('codfamilia')
])->get();
Operadores
Existe una función para cualquier operador que queramos usar en el where, de forma que el código sea lo más legible posible:
eq
(=)NotEq
(<>)lt
(<)lte
(<=)gt
(>)gte
(>=)isNull
(IS NULL)isNotNull
(IS NOT NULL)in
(IN)notIn
(NOT IN)between
(BETWEEN)notBetween
(NOT BETWEEN)like
(LIKE)notLike
(NOT LIKE)xlike
: esta es una versión nuestra del operador like donde previamente desglosamos las palabras a buscar. Así si busas 'mi casa' mostrará tanto las coincidencias con 'mi casa' como las que coincidan con 'casa mi'.
$where = [
Where::eq('codfabricante, '123'),
Where::isNull('codfamilia'),
Where::lt('precio', 10)
];
// WHERE codfabricante = '123' AND codfamilia IS NULL AND precio < '10'
Uso de paréntesis
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:
( and ) or ( and )
$where = [
Where::sub([
Where::eq('sevende', true),
Where::eq('ventasinstock', false)
]),
Where::orSub([
Where::eq('secompra', true),
Where::eq('nostock', false),
]),
];
and ( or ) and
$where = [
Where::eq('sevende', true),
Where::andSub([
Where::eq('ventasinstock', false),
Where::orEq('secompra', true),
]),
Where::eq('nostock', false)
];