administrador.base.orm.modelo.genera_sql_filtro - gamboamartin/administrador GitHub Wiki
genera_sql_filtro
La función consulta_full_and
genera una consulta SQL completa utilizando un objeto stdClass
llamado $complemento
, una consulta base en forma de cadena, y un objeto modelo
. La función primero valida que la consulta base no esté vacía, luego inicializa el complemento con los filtros y parámetros necesarios, y finalmente construye la consulta SQL completa. Si ocurre algún error en cualquier parte del proceso, devuelve un array con los detalles del error.
Signatura
private function genera_sql_filtro(array $columnas, array $columnas_by_table, bool $columnas_en_bruto, bool $con_sq,
array $diferente_de, array $extra_join, array $filtro, array $filtro_especial,
array $filtro_extra, array $filtro_rango, array $group_by, array $in, int $limit,
array $not_in, int $offset, array $order, string $sql_extra, string $tipo_filtro,
bool $count = false, array $filtro_fecha = array()): array|string
Parámetros
array $columnas
- Tipo:
array
- Descripción: Un array de columnas que serán seleccionadas en la consulta SQL.
array $columnas_by_table
- Tipo:
array
- Descripción: Un array que define las columnas organizadas por tabla, útil para identificar la tabla de origen de cada columna.
bool $columnas_en_bruto
- Tipo:
bool
- Descripción: Indica si las columnas deben ser tratadas de forma directa (en bruto) sin aplicar transformaciones.
bool $con_sq
- Tipo:
bool
- Descripción: Define si se debe incluir subconsultas (
subqueries
) en la consulta generada.
array $diferente_de
- Tipo:
array
- Descripción: Condiciones
!=
que se aplicarán a las columnas en la consulta SQL.
array $extra_join
- Tipo:
array
- Descripción: Define las cláusulas
JOIN
adicionales que se incluirán en la consulta.
array $filtro
- Tipo:
array
- Descripción: Un array de filtros generales que se aplicarán en la cláusula
WHERE
.
array $filtro_especial
- Tipo:
array
- Descripción: Un conjunto de condiciones especiales que se aplicarán a la consulta.
array $filtro_extra
- Tipo:
array
- Descripción: Filtros adicionales que se aplicarán a la consulta.
array $filtro_rango
- Tipo:
array
- Descripción: Un rango de valores que se aplicará en la consulta SQL.
array $group_by
- Tipo:
array
- Descripción: Las columnas que serán utilizadas en la cláusula
GROUP BY
.
array $in
- Tipo: `array**
- Descripción: Condiciones
IN
que se aplicarán a las columnas en la consulta SQL.
int $limit
- Tipo:
int
- Descripción: El límite de filas que se deben devolver. Debe ser mayor o igual a cero.
array $not_in
- Tipo:
array
- Descripción: Condiciones
NOT IN
que se aplicarán a las columnas en la consulta SQL.
int $offset
- Tipo:
int
- Descripción: El desplazamiento de filas (para paginación). Debe ser mayor o igual a cero.
array $order
- Tipo:
array
- Descripción: Las columnas que se utilizarán en la cláusula
ORDER BY
.
string $sql_extra
- Tipo:
string
- Descripción: SQL adicional que puede agregarse a la consulta.
string $tipo_filtro
- Tipo:
string
- Descripción: El tipo de filtro que se utilizará (
AND
oOR
).
bool $count
(opcional)
- Tipo:
bool
- Descripción: Define si la consulta debe contar el número de filas en lugar de devolverlas.
- Valor predeterminado:
false
.
array $filtro_fecha
(opcional)
- Tipo:
array
- Descripción: Filtros basados en fechas que se aplicarán a la consulta SQL.
- Valor predeterminado:
[]
.
Retorno
array|string
- Tipo:
array
ostring
- Descripción:
- Si la operación es exitosa, devuelve la consulta SQL generada como una cadena.
- Si ocurre algún error en el proceso, devuelve un array con un mensaje de error y los detalles correspondientes.
Explicación Detallada
-
Validación de
LIMIT
yOFFSET
:- La función comienza validando que los valores de
LIMIT
yOFFSET
sean mayores o iguales a cero. Si alguno de estos valores es negativo, se devuelve un error.
if ($limit < 0) { return $this->error->error(mensaje: 'Error limit debe ser mayor o igual a 0', data: $limit, es_final: true); } if ($offset < 0) { return $this->error->error(mensaje: 'Error $offset debe ser mayor o igual a 0', data: $offset, es_final: true); }
- La función comienza validando que los valores de
-
Validación del tipo de filtro:
- La función valida que el tipo de filtro (
$tipo_filtro
) sea válido llamando averifica_tipo_filtro
. Si no es válido, se captura y se devuelve un error.
$verifica_tf = (new \gamboamartin\where\where())->verifica_tipo_filtro(tipo_filtro: $tipo_filtro); if (errores::$error) { return $this->error->error(mensaje: 'Error al validar tipo_filtro', data: $verifica_tf); }
- La función valida que el tipo de filtro (
-
Generación de la consulta base:
- A continuación, se genera la consulta base utilizando la función
genera_consulta_base
, que selecciona las columnas y las tablas necesarias. Si ocurre un error, se captura y se devuelve un mensaje de error.
$consulta = $this->genera_consulta_base(columnas: $columnas, columnas_by_table: $columnas_by_table, columnas_en_bruto: $columnas_en_bruto, con_sq: $con_sq, count: $count, extension_estructura: $this->extension_estructura, extra_join: $extra_join, renombradas: $this->renombres); if (errores::$error) { return $this->error->error(mensaje: 'Error al generar sql', data: $consulta); }
- A continuación, se genera la consulta base utilizando la función
-
Procesamiento de la cláusula
IN
:- Luego, la función procesa la cláusula
IN
utilizandoin_llave
. Si ocurre un error, se captura y se devuelve un mensaje de error.
$in = $this->in_llave(in: $in); if (errores::$error) { return $this->error->error(mensaje: 'Error al integrar in', data: $in); }
- Luego, la función procesa la cláusula
-
Generación del complemento SQL:
- A continuación, se genera el complemento SQL (filtros, rangos, etc.) mediante la función
complemento_sql
. Si ocurre un error, se devuelve un array de error.
$complemento_sql = (new filtros())->complemento_sql(aplica_seguridad: false, diferente_de: $diferente_de, filtro: $filtro, filtro_especial: $filtro_especial, filtro_extra: $filtro_extra, filtro_rango: $filtro_rango, group_by: $group_by, in: $in, limit: $limit, modelo: $this, not_in: $not_in, offset: $offset, order: $order, sql_extra: $sql_extra, tipo_filtro: $tipo_filtro, filtro_fecha: $filtro_fecha); if (errores::$error) { return $this->error->error(mensaje: 'Error al maquetar sql', data: $complemento_sql); }
- A continuación, se genera el complemento SQL (filtros, rangos, etc.) mediante la función
-
Generación de la consulta SQL completa:
- Finalmente, se genera la consulta SQL completa llamando a
consulta_full_and
. Si ocurre un error, se devuelve un array de error.
$sql = (new filtros())->consulta_full_and(complemento: $complemento_sql, consulta: $consulta, modelo: $this); if (errores::$error) { return $this->error->error(mensaje: 'Error al maquetar sql', data: $sql); }
- Finalmente, se genera la consulta SQL completa llamando a
-
Retorno de la consulta SQL:
- La consulta SQL generada se almacena en la propiedad
consulta
del modelo y se devuelve.
$this->consulta = $sql; return $sql;
- La consulta SQL generada se almacena en la propiedad
Ejemplo de uso
$columnas = ['id', 'nombre'];
$columnas_by_table = ['tabla1' => ['id', 'nombre']];
$limit = 10;
$offset = 0;
$in = ['id IN (1, 2, 3)'];
$not_in = ['id NOT IN (4, 5)'];
$order = ['nombre ASC'];
$tipo_filtro = 'AND';
$sql = $this->genera_sql_filtro(
columnas: $columnas,
columnas_by_table: $columnas_by_table,
columnas_en_bruto: false,
con_sq: false,
diferente_de: [],
extra_join: [],
filtro: [],
filtro_especial: [],
filtro_extra: [],
filtro_rango: [],
group_by: [],
in: $in,
limit: $limit,
not_in: $not_in,
offset: $offset,
order: $order,
sql_extra: '',
tipo_filtro: $tipo_filtro
);
// Resultado esperado:
// Una consulta SQL generada que incluye los filtros, limitaciones y órdenes especificados.
Código de la Función
private function genera_sql_filtro(array $columnas, array $columnas_by_table, bool $columnas_en_bruto, bool $con_sq,
array $diferente_de, array $extra_join, array $filtro, array $filtro_especial,
array $filtro_extra, array $filtro_rango, array $group_by, array $in, int $limit,
array $not_in, int $offset, array $order, string $sql_extra, string $tipo_filtro,
bool $count = false, array $filtro_fecha = array()): array|string
{
if($limit<0){
return $this->error->error(mensaje: 'Error limit debe ser mayor o igual a 0',data: $limit,
es_final: true);
}
if($offset<0){
return $this->error->error(mensaje: 'Error $offset debe ser mayor o igual a 0',data: $offset,
es_final: true);
}
$verifica_tf = (new \gamboamartin\where\where())->verifica_tipo_filtro(tipo_filtro: $tipo_filtro);
if(errores::$error){
return $this->error->error(mensaje: 'Error al validar tipo_filtro',data: $verifica_tf);
}
$consulta = $this->genera_consulta_base(columnas: $columnas, columnas_by_table: $columnas_by_table,
columnas_en_bruto: $columnas_en_bruto, con_sq: $con_sq, count: $count,
extension_estructura: $this->extension_estructura, extra_join: $extra_join, renombradas: $this->renombres);
if(errores::$error){
return $this->error->error(mensaje: 'Error al generar sql',data: $consulta);
}
$in = $this->in_llave(in: $in);
if(errores::$error){
return $this->error->error(mensaje: 'Error al integrar in',data: $in);
}
$complemento_sql = (new filtros())->complemento_sql(aplica_seguridad:false, diferente_de: $diferente_de,
filtro: $filtro, filtro_especial: $filtro_especial, filtro_extra: $filtro_extra,
filtro_rango: $filtro_rango, group_by: $group_by, in: $in, limit: $limit, modelo: $this, not_in: $not_in,
offset: $offset, order: $order, sql_extra: $sql_extra, tipo_filtro: $tipo_filtro,
filtro_fecha: $filtro_fecha);
if(errores::$error){
return $this->error->error(mensaje: 'Error al maquetar sql',data: $complemento_sql);
}
$sql = (new filtros())->consulta_full_and(complemento: $complemento_sql, consulta: $consulta, modelo: $this);
if(errores::$error){
return $this->error->error(mensaje:'Error al maquetar sql',data: $sql);
}
$this->consulta = $sql;
return $sql;
}