administrador.base.orm.filtros.complemento_sql - gamboamartin/administrador GitHub Wiki
complemento_sql
La función complemento_sql
genera una estructura SQL completa, que incluye filtros y parámetros adicionales como LIMIT
, OFFSET
, GROUP BY
, y ORDER
, además de manejar cláusulas especiales como IN
, NOT IN
, y filtros basados en fechas o rangos. Valida que los parámetros clave como LIMIT
y OFFSET
sean mayores o iguales a cero y ajusta los filtros antes de generar el SQL final. Si ocurre algún error en el proceso, devuelve un array con los detalles del error.
Signatura
final public function complemento_sql(bool $aplica_seguridad, array $diferente_de, array $filtro,
array $filtro_especial, array $filtro_extra, array $filtro_rango,
array $group_by, array $in, int $limit, modelo $modelo, array $not_in,
int $offset, array $order, string $sql_extra, string $tipo_filtro,
array $filtro_fecha = array()): array|stdClass
Parámetros
bool $aplica_seguridad
- Tipo:
bool
- Descripción: Define si se debe aplicar seguridad en la generación de la consulta SQL.
array $diferente_de
- Tipo:
array
- Descripción: Un array de condiciones que excluyen ciertos valores (
!=
) en la consulta.
array $filtro
- Tipo:
array
- Descripción: Un array de filtros generales que serán utilizados en la consulta SQL.
array $filtro_especial
- Tipo:
array
- Descripción: Un array de condiciones especiales que se aplicarán a la consulta.
array $filtro_extra
- Tipo:
array
- Descripción: Filtros adicionales que serán utilizados en la consulta SQL.
array $filtro_rango
- Tipo:
array
- Descripción: Un array de rangos que se aplicarán en la consulta SQL.
array $group_by
- Tipo:
array
- Descripción: Un array de columnas que serán utilizadas en la cláusula
GROUP BY
.
array $in
- Tipo:
array
- Descripción: Un array de valores que serán utilizados en la cláusula
IN
de la consulta SQL.
int $limit
- Tipo:
int
- Descripción: El límite de resultados que debe aplicarse a la consulta. Debe ser mayor o igual a cero.
modelo $modelo
- Tipo:
modelo
- Descripción: Un objeto de tipo
modelo
que contiene columnas y filtros predefinidos para la consulta.
array $not_in
- Tipo:
array
- Descripción: Un array de valores que serán excluidos mediante la cláusula
NOT IN
en la consulta SQL.
int $offset
- Tipo:
int
- Descripción: El desplazamiento de resultados (paginación) para la consulta. Debe ser mayor o igual a cero.
array $order
- Tipo:
array
- Descripción: Un array de columnas que serán utilizadas en la cláusula
ORDER BY
de la consulta.
string $sql_extra
- Tipo:
string
- Descripción: SQL adicional que puede agregarse a la consulta, como cláusulas extra o condiciones adicionales.
string $tipo_filtro
- Tipo:
string
- Descripción: Define el tipo de filtro que se aplicará, por ejemplo,
AND
oOR
. Este parámetro es validado para asegurar que sea un valor permitido.
array $filtro_fecha
(opcional)
- Tipo:
array
- Descripción: Filtros basados en fechas que se aplicarán a la consulta SQL.
- Valor predeterminado:
[]
(array vacío).
Retorno
array|stdClass
- Tipo:
array
ostdClass
- Descripción:
- Si la operación es exitosa, devuelve un objeto
stdClass
que contiene los filtros generados, los parámetros SQL, y cualquier ajuste necesario en los filtros. - Si ocurre un error, devuelve un array con un mensaje de error y los detalles del problema.
- Si la operación es exitosa, devuelve un objeto
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: $params_fn, es_final: true); } if ($offset < 0) { return $this->error->error(mensaje: 'Error $offset debe ser mayor o igual a 0', data: $params_fn, es_final: true); }
- La función comienza validando que los valores de
-
Validación del tipo de filtro:
- La función llama a
verifica_tipo_filtro
para asegurarse de que el tipo de filtro ($tipo_filtro
) sea válido. Si no lo es, se captura el 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 llama a
-
Generación de parámetros SQL:
- La función utiliza
params_sql
para generar los parámetros SQL necesarios comoLIMIT
,OFFSET
,GROUP BY
, yORDER BY
. Si ocurre un error en este proceso, se devuelve un mensaje de error.
$params = (new params_sql())->params_sql(aplica_seguridad: $aplica_seguridad, group_by: $group_by, limit: $limit, modelo_columnas_extra: $modelo->columnas_extra, offset: $offset, order: $order, sql_where_previo: $sql_extra); if (errores::$error) { return $this->error->error(mensaje: 'Error al generar parametros sql', data: $params); }
- La función utiliza
-
Generación de filtros completos:
- Se llama a la función
data_filtros_full
para generar los filtros completos y ajustados a partir de los parámetros proporcionados. Si ocurre un error durante este paso, se captura y se devuelve un mensaje de error.
$filtros = (new where())->data_filtros_full(columnas_extra: $modelo->columnas_extra, diferente_de: $diferente_de, filtro: $filtro, filtro_especial: $filtro_especial, filtro_extra: $filtro_extra, filtro_fecha: $filtro_fecha, filtro_rango: $filtro_rango, in: $in, keys_data_filter: $modelo->keys_data_filter, not_in: $not_in, sql_extra: $sql_extra, tipo_filtro: $tipo_filtro); if (errores::$error) { return $this->error->error(mensaje: 'Error al generar filtros', data: $filtros); }
- Se llama a la función
-
Ajuste de la cláusula
IN
:- Una vez generados los filtros, la función ajusta la cláusula
IN
para eliminar espacios innecesarios y asegurar un formato correcto.
if (!isset($filtros->in)) { $filtros->in = ''; } $filtros->in = str_replace('( (', '((', $filtros->in); $filtros->in = str_replace(' ', ' ', $filtros->in); $filtros->in = trim($filtros->in);
- Una vez generados los filtros, la función ajusta la cláusula
-
Retorno del objeto de filtros:
- Finalmente, la función asigna los parámetros generados al objeto
$filtros
y devuelve el resultado.
$filtros->params = $params; return $filtros;
- Finalmente, la función asigna los parámetros generados al objeto
Ejemplo de uso
$aplica_seguridad = true;
$diferente_de = ['id != 1'];
$filtro = ['estatus = "activo"'];
$filtro_especial = [];
$filtro_extra = [];
$filtro_rango = [];
$group_by = ['nombre'];
$in = ['id IN (1, 2, 3)'];
$limit = 10;
$modelo = new modelo();
$not_in = ['id NOT IN (4, 5)'];
$offset = 0;
$order = ['nombre ASC'];
$sql_extra = 'ORDER BY nombre ASC';
$tipo_filtro = 'AND';
$filtro_fecha = [];
$resultado = $this->complemento_sql($aplica_seguridad, $diferente_de, $filtro, $filtro_especial, $filtro_extra,
$filtro_rango, $group_by, $in, $limit, $modelo, $not_in, $offset, $order, $sql_extra, $tipo_filtro, $filtro_fecha);
Código de la Función
final public function complemento_sql(bool $aplica_seguridad, array $diferente_de, array $filtro,
array $filtro_especial, array $filtro_extra, array $filtro_rango,
array $group_by, array $in, int $limit, modelo $modelo, array $not_in,
int $offset, array $order, string $sql_extra, string $tipo_filtro,
array $filtro_fecha = array()): array|stdClass
{
$params_fn = new stdClass();
$params_fn->aplica_seguridad = $aplica_seguridad;
$params_fn->diferente_de = $diferente_de;
$params_fn->filtro = $filtro;
$params_fn->filtro_especial = $filtro_especial;
$params_fn->filtro_extra = $filtro_extra;
$params_fn->filtro_fecha = $filtro_fecha;
$params_fn->filtro_rango = $filtro_rango;
$params_fn->group_by = $group_by;
$params_fn->in = $in;
$params_fn->limit = $limit;
$params_fn->modelo = $modelo;
$params_fn->not_in = $not_in;
$params_fn->offset = $offset;
$params_fn->order = $order;
$params_fn->sql_extra = $sql_extra;
$params_fn->tipo_filtro = $tipo_filtro;
if($limit<0){
return $this->error->error(mensaje: 'Error limit debe ser mayor o igual a 0',data: $params_fn,
es_final: true);
}
if($offset<0){
return $this->error->error(mensaje: 'Error $offset debe ser mayor o igual a 0',data: $params_fn,
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);
}
$params = (new params_sql())->params_sql(aplica_seguridad: $aplica_seguridad, group_by: $group_by,
limit: $limit,modelo_columnas_extra: $modelo->columnas_extra,offset: $offset,
order: $order,sql_where_previo: $sql_extra);
if(errores::$error){
return $this->error->error(mensaje: 'Error al generar parametros sql',data:$params);
}
$filtros = (new where())->data_filtros_full(columnas_extra: $modelo->columnas_extra,
diferente_de: $diferente_de, filtro: $filtro, filtro_especial: $filtro_especial,
filtro_extra: $filtro_extra, filtro_fecha: $filtro_fecha, filtro_rango: $filtro_rango, in: $in,
keys_data_filter: $modelo->keys_data_filter, not_in: $not_in, sql_extra: $sql_extra,
tipo_filtro: $tipo_filtro);
if(errores::$error){
return $this->error->error(mensaje: 'Error al generar filtros',data:$filtros);
}
if(!isset($filtros->in)){
$filtros->in = '';
}
$filtros->in = str_replace('( (', '((', $filtros->in);
$filtros->in = str_replace(' ', ' ', $filtros->in);
$filtros->in = str_replace(' ', ' ', $filtros->in);
$filtros->in = str_replace(' ', ' ', $filtros->in);
$filtros->in = str_replace(' ', ' ', $filtros->in);
$filtros->in = str_replace('( (', '((', $filtros->in);
$filtros->in = trim($filtros->in);
$filtros->params = $params;
return $filtros;
}